これは実際に証明するのが実際に簡単です。私はこれをコンパイルすると
for (int i = 0; i < 100_000; ++i) {
Stream.of(1, 2, 3, 4)
.map(x -> x * 2)
.collect(Collectors.toList());
}
私はラムダ式について(javap
を経由して)生成された脱糖メソッドが呼び出されることを確認することができます:ここにいくつかの非常に簡単なコードであるlambda$main$0
(JDK-9には、これはそうではありません多くのこと)。
そして、私は単純にこのコードを実行することができますので、このような方法のためにインライン化すると、通常のように動作します
Inline::lambda$main$0 (10 bytes) inline (hot)
:
java -XX:-TieredCompilation
-XX:CICompilerCount=1
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintCompilation
-XX:+PrintInlining
-XX:CompileCommand="print, *.lambda"
InlineLambdaTest
> inline.txt
そして、このような行があるファイルを見ています。 ...lambda...
で始まるより多くの行があることに注意してください。これは、ラムダ式を使用する他の多くの場所も暑いと考えられているからです。
[Javaラムダ関数はどのようにコンパイルされるのですか?](https://stackoverflow.com/q/16827262/2711488) – Holger
「intx MaxInlineLevel = 9'」を正確に思い出してください。 – Eugene