在Java Lambda相等和/或实例化上 [英] On Java lambda equality and/or instantiation
本文介绍了在Java Lambda相等和/或实例化上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
下面的代码段为什么在第二遍打印时显示为真?应该不是新实例吗?
Why does the snippet below print true on second pass through? Should it not be a new instance?
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
推荐答案
Check out this article about how lambdas are implemented.
本质上,编译器将您的两个 System.nanoTime()
转换为类上的以下静态方法:
Essentially the compiler turned your two System.nanoTime()
into the following static methods on your class:
static Long lambda$1() {
return System.nanoTime();
}
static Long lambda$2() {
return System.nanoTime();
}
然后使用 查看全文