java 编译器是否将 Function<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 允许空值,而下面的 lambda 不允许。 编译器必须进行大量的静态代码分析,以查看是否可以将 null 传递给函数以对其进行优化。

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

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

不确定这是否仍然可行。由于可能发生这种优化的可能性和位置的总数,这将增加 javac 总编译时间的很多时间。

Java 编译器 (javac) 不执行此类优化。事实上,如 Optimization by Java Compiler 所示,它只执行很少的优化,以便将所有可用信息提供给 JIT 编译器。

因此,如果您将一些 lambda 声明为 Function<Double,Integer>,字节码将这样表示它 – 好吧,它的原始类型 Function.

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

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