Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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_Lambda_Java 8 - Fatal编程技术网

关于Java lambda等式和/或实例化

关于Java lambda等式和/或实例化,java,lambda,java-8,Java,Lambda,Java 8,为什么下面的代码段在第二次传递时打印为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

为什么下面的代码段在第二次传递时打印为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;
        }
    }
}
看看这个关于lambda是如何实现的

本质上,编译器将您的两个
System.nanoTime()
转换为类上的以下静态方法:

static Long lambda$1() {
    return System.nanoTime();
}

static Long lambda$2() {
    return System.nanoTime();
}

然后使用。坦率地说,我很失望Java编译器没有意识到lambda主体是相同的,只创建了一个实例。如果Java编译器足够聪明,那么每一行都应该打印
true

我想这是一个编译器优化。循环的每次迭代都不需要一个新的实例,因此编译器不必费心。相关:为什么要编辑以重新添加不相关的注释?(只是想知道,也许它们是相关的)@Jean-FrançoisSavard我认为它们添加了一些上下文,
的行为类似于
()->
,但不像
新的
谈话很便宜,代码本身就代表了它。注释在我看来没有额外的价值。即使编译器足够聪明,可以将
lambda$1()
lambda$2()
折叠到一个方法中,引用该方法的不同lambda创建站点仍然会导致创建不同的对象实例(甚至不同的类)。这可以通过多次使用方法引用(如
System::nanoTime
)来轻松证明,因为这些引用指向相同的目标方法,因为没有生成合成方法。尽管如此,考虑到Oracle当前的实现,它们还是会向不同的对象屈服。
static Long lambda$1() {
    return System.nanoTime();
}

static Long lambda$2() {
    return System.nanoTime();
}