gpt4 book ai didi

java - 为什么 lambda 调用有 2 个堆栈帧?

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:00 25 4
gpt4 key购买 nike

以下代码:

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 个栈帧?

最佳答案

PrintLambdaStackTrace$$Lambda$1/1831932724.accept(Unknown Source)

这是一个生成的类,它实现了所需的接口(interface)。它的 accept 方法只是一个 stub ,委托(delegate)给一个在编译时生成并添加到 PrintLambdaStackTrace 类的方法。此类在 lambda 链接时生成(第一次需要创建 lambda 实例)。

PrintLambdaStackTrace.lambda$main$0(PrintLambdaStackTrace.java:6)

这是实际实现 lambda 行为的方法。它属于 PrintLambdaStackTrace 类。

关于java - 为什么 lambda 调用有 2 个堆栈帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31436040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com