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