【发布时间】:2016-01-07 10:41:58
【问题描述】:
为什么下面的 sn-p 在第二次通过时打印为 true?不应该是一个新的实例吗?
import java.util.function.Supplier;
public class Foo {
public static void main(String[] args) throws Exception {
Supplier<Long> old = () -> System.nanoTime();
for (int i = 0; i < 3; i++) {
/* false true true
Supplier<Long> foo = System::nanoTime;*/
Supplier<Long> foo = () -> System.nanoTime();
/* false false false
Supplier<Long> foo = new Supplier<Long>() {
@Override
public Long get() {
return System.nanoTime();
}
};
//*/
System.out.printf("%s %s %s%n", foo == old, foo, old);
old = foo;
}
}
}
false Foo$$Lambda$2/122883338@1ddc4ec2 Foo$$Lambda$1/1534030866@133314b
true Foo$$Lambda$2/122883338@1ddc4ec2 Foo$$Lambda$2/122883338@1ddc4ec2
true Foo$$Lambda$2/122883338@1ddc4ec2 Foo$$Lambda$2/122883338@1ddc4ec2
【问题讨论】:
-
我想这是一个编译器优化。循环的每次迭代都不需要新实例,因此编译器不会打扰。
-
你为什么编辑重新添加不相关的 cmets ? (只是想知道,也许它们是相关的)
-
@Jean-FrançoisSavard 我认为他们添加了一些上下文,
::的行为类似于()->,但不像new -
谈话很便宜,代码代表自己。 cmets 不提供额外的 IMO 价值。