Bog*_*mac 11 java lambda java-8
以下代码:
public static void main(String[] args) {
Collections.singleton(1).stream().forEach(i -> new Exception().printStackTrace());
}
Run Code Online (Sandbox Code Playgroud)
打印:
java.lang.Exception
at PrintLambdaStackTrace.lambda$main$0(PrintLambdaStackTrace.java:6)
at PrintLambdaStackTrace$$Lambda$1/1831932724.accept(Unknown Source)
at java.util.Collections$2.tryAdvance(Collections.java:4717)
at java.util.Collections$2.forEachRemaining(Collections.java:4725)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at PrintLambdaStackTrace.main(PrintLambdaStackTrace.java:6)
Run Code Online (Sandbox Code Playgroud)
lambda调用是如何实现的?为什么有2个堆栈帧?
PrintLambdaStackTrace$$Lambda$1/1831932724.accept(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
这是一个生成的类,它实现了所需的接口.它的accept
方法只是一个存根,委托给一个在编译时生成并添加到PrintLambdaStackTrace
类中的方法.此类是在lambda链接时生成的(第一次需要创建lambda实例).
PrintLambdaStackTrace.lambda$main$0(PrintLambdaStackTrace.java:6)
Run Code Online (Sandbox Code Playgroud)
这是实际实现lambda行为的方法.它属于这个PrintLambdaStackTrace
类.