Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么?java lambda表达式(没有外部引用变量)在循环中具有相同的哈希代码_Java_Java 8 - Fatal编程技术网

为什么?java lambda表达式(没有外部引用变量)在循环中具有相同的哈希代码

为什么?java lambda表达式(没有外部引用变量)在循环中具有相同的哈希代码,java,java-8,Java,Java 8,for循环或streams foreach中的lambda表达式具有相同的哈希代码。 为什么? 在其他情况下; 我在lambda表达式体块中添加了外部引用变量代码 像这样-> cs = (list) -> { t.hashCode(); // <---- !!! System.out.println("------st

for循环或streams foreach中的lambda表达式具有相同的哈希代码。 为什么?

在其他情况下; 我在lambda表达式体块中添加了外部引用变量代码

像这样->

                            cs = (list) -> {
                            t.hashCode(); // <---- !!!
                            System.out.println("------start");
                            list.forEach(it -> {
                                System.out.println(it);
                            });
                            System.out.println("------end");
                        };
此代码打印不同的哈希代码


ㅜ..ㅜ

您的问题似乎是,为什么没有t.hashCode的第一种情况下hashCode是相同的,为什么添加t.hashCode时hashCode是不同的

@holi java为您指明了正确的方向——第一个被称为无状态lambda——因此,在当前的实现中,您将始终得到一个单例——消费者的相同实例将被重新用于所有调用

只要通过添加外部变量使其成为有状态的(在您的例子中是t.hashCode),您就将其设置为有状态lambda,并且在当前的实现中,您每次都会得到一个新的使用者实例,从而输出不同的hashCode


更有趣的是——这只对调试有用——因为您不能覆盖lambda表达式的hashCode、equals或toString——所以除了了解某些事情的工作原理之外,这些信息是非常无用的

请看这里:FWIW:Consumer-这种类型的散列码与输入/状态没有本质上的关系,进行这样的调用可能不是真正的代码想要做的。你的问题是什么?您是否希望使用不同的哈希代码?为什么?当然,散列码只是一个症状。JRE不仅可以自由地实现重用或共享,而且生成的类也可以用他们认为合适的任何方法来覆盖哈希代码。因此,虽然在当前的实现中,相同的哈希代码表示共享实例的可能性很高,但在将来的版本中不必如此。
                            cs = (list) -> {
                            t.hashCode(); // <---- !!!
                            System.out.println("------start");
                            list.forEach(it -> {
                                System.out.println(it);
                            });
                            System.out.println("------end");
                        };