使用lambdas解释Java堆栈跟踪,例如".lambda $ null $ 2"&和"$$ Lambda $"

And*_*ren 10 java lambda logging exception stack-trace

我正在寻找Java 8堆栈跟踪中lambda周围发生的部分的定义

例如这段代码

Object inputData = someData();

myList.stream().forEach(listItem -> {

    Query query = (Query) listItem.getSingle().apply(this.getId());

    Object data = diffUtils.applyProjection(query, inputData);

    myStringCollection.stream()
       .filter(destination -> myPredicateMethod(listItem, destination))
       .forEach(destination -> myProcessMethod(destination, data));
}
Run Code Online (Sandbox Code Playgroud)

有时产生这种例外.

at [CLASS].lambda$null$2([CLASS].java:85)
at [CLASS]$$Lambda$64/730559617.accept(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

异常中描述的不同部分是什么?什么是"null","2","64","730559617"和"Unknown Source"告诉我什么?

这里可以找到一个更详细的例子(但是这里我的例外中的"null"不存在).http://blog.takipi.com/the-dark-side-of-lambda-expressions-in-java-8/

Pet*_*rey 6

该生成的类名没有标准定义。这是故意避免您编写依赖于它的代码,这使设计人员以后很难更改它。

话虽如此,您几乎看不到什么;

  • 类名称的第一部分是呼叫站点的类。
  • 最后一个数字$是lambda的全局计数器。这取决于生成lambda的代码的顺序。
  • 大数字是生成的ID。每次运行时,相同的lambda都不相同,但启动后不会更改。

“未知源”告诉您此生成的代码没有与之关联的调试信息。

我们正在寻找一个用于更改lambda的toString的库,以使您了解与之关联的代码。也就是说,至少在平凡的情况下,它看起来像lambda的代码。