【发布时间】:2015-10-04 19:50:12
【问题描述】:
以下代码:
public static void main(String[] args) {
Collections.singleton(1).stream().forEach(i -> new Exception().printStackTrace());
}
打印:
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)
lambda 调用是如何实现的?为什么有 2 个堆栈帧?
【问题讨论】:
-
这是个好问题。我会看的,因为我自己对答案很感兴趣。我的猜测是 JVM 在执行时创建了一个匿名类。一个堆栈来自用于创建类的方法,第二个来自类本身。但这只是猜测。