繁体   English   中英

Java编译器是否转换功能 <Double,Integer> 到DoubleToIntFunction?

[英]Does java compiler convert Function<Double,Integer> to DoubleToIntFunction?

Function<Double,Integer> f1=(d)-> {
        if(d>5)
            return 0;
        return 1;
    };
DoubleToIntFunction f2=(d)-> {
        if(d>5)
            return 1;
        return 0;
    };
double d=5.0;
f1.apply(d);
f2.applyAsInt(d);

将f1优化为DoubleToIntFunction(类似于f2)。

我不知道怎么办,上面的lambda允许null,而下面的lambda不允许。 编译器将不得不进行大量的静态代码分析,以查看是否可以将null传递给Function以便对其进行优化。

f1.apply(null); //works!
f2.applyAsInt(null); //won't compile!

假设有两件事,就我所知,将来可能会发生这种情况。 1)Double和Integer可能是value types 因此永远不会为空,并且2)AOT javac编译器将就位。

不知道这是否仍然可行。由于总的可能性和可能发生这种优化的地方,这将增加javac的总编译时间。

Java编译器(javac)不执行此类优化。 实际上,正如Java Compiler的Optimization中所指出的那样,为了将所有可用信息传递给JIT编译 ,它仅执行很少的优化。

因此,如果您将lambda声明为Function<Double,Integer> ,则字节码将这样表示它-很好,其原始类型为Function

现在,根据那部分代码的上下文和执行负载,JIT编译器也许可以内联lambda(或该Function其他实现),并产生与DoubleToIntFunction产生的代码非常相似甚至相同的机器代码。版。

注意,在这种情况下,类型信息将完全消失。 它不会用一个替换另一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM