Я только что провел быстрый эксперимент в Eclipse.Являются ли трассировки стека менее доступными при использовании ссылок на методы против lambdas?
public class StackTractTest {
static class Nasty {
public Integer toInt() {
if (1 == 1) throw new RuntimeException();
return 1;
}
}
@Test
public void methodReference() {
Stream.of(new Nasty())
.map(Nasty::toInt)
.findFirst();
}
@Test
public void lambda() {
Stream.of(new Nasty())
.map(n -> n.toInt())
.findFirst();
}
}
Когда метод ссылка тест не пройден, то след начинается
java.lang.RuntimeException
at com.example.StackTractTest$Nasty.toInt(StackTractTest.java:11)
at com.example.StackTractTest$$Lambda$1/1681433494.apply(Unknown Source)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
Там нет ссылки назад к линии, на которой эталонный метод используется, хотя в конце следа (не показан) ссылается на линию с findFirst
.
Хотя lamdba StackTrace начинается
java.lang.RuntimeException
at com.example.StackTractTest$Nasty.toInt(StackTractTest.java:11)
at com.example.StackTractTest.lambda$0(StackTractTest.java:26)
at com.example.StackTractTest$$Lambda$1/1681433494.apply(Unknown Source)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
Что правильно идентифицирует лямбда использовался на линии 26.
Является ли это особенностью компилятора Eclipse, или это общий недостаток использования ссылок методов, которые следует учитывать при выборе между ними и лямбдой?
Нет, это как это происходит из Java. Они работают над улучшением опыта отслеживания стека. –
Я никогда не слышал, чтобы разработчик просил более длинную трассировку стека раньше ... – Holger