Właśnie przeprowadziłem szybki eksperyment w Eclipse.Czy śledzenie stosu jest mniej żeglowne, gdy używa się referencji metod względem 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();
}
}
Gdy test metodą odniesienie nie, ślad zaczyna
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)
nie ma odniesienia do linii, w której odniesienie sposób jest stosowany, chociaż koniec śladu (nie pokazano) powraca do linii z findFirst
na.
Choć StackTrace lamdba zaczyna
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)
Które poprawnie identyfikuje lambda został wykorzystany na linii 26.
Czy to osobliwością kompilatora Eclipse czy jest to ogólny wadą stosowania metody referencje że należy wziąć pod uwagę przy wyborze między nimi a lambdą?
Nie, to jak pochodzi z Java. Pracują nad poprawieniem doświadczenia w stosie. –
Nigdy nie słyszałem, żeby programista prosił o dłuższy ślad na stosie przed ... – Holger