2回目のパススルーでスニペットが真に印刷されるのはなぜですか?新しいインスタンスではないはずですか?Javaラムダの平等またはインスタンシエーションについて
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/[email protected] Foo$$Lambda$1/[email protected]
true Foo$$Lambda$2/[email protected] Foo$$Lambda$2/[email protected]
true Foo$$Lambda$2/[email protected] Foo$$Lambda$2/[email protected]
私はそれがコンパイラの最適化だと思います。ループの反復ごとに新しいインスタンスを作成する必要はないため、コンパイラは気にしません。 – megaflop
関連:http://stackoverflow.com/questions/24095875/is-there-a-way-to-compare-lambdas –
なぜ関係のないコメントを追加するために編集しましたか? –