Ho appena eseguito un rapido esperimento in Eclipse.Le tracce dello stack sono meno navigabili quando si utilizzano i riferimenti al metodo vs 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();
}
}
Quando il saggio metodo di riferimento non riesce, la traccia inizia
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)
Non v'è alcun riferimento di nuovo alla linea su cui viene utilizzato il metodo di riferimento anche se la fine della traccia (non mostrato) ricollega alla linea con findFirst
su.
Mentre lo stacktrace Lamdba inizia
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)
che identifica correttamente il lambda è stato utilizzato sulla linea 26.
Si tratta di una peculiarità del compilatore Eclipse o si tratta di uno svantaggio generale di utilizzare metodi riferimenti che dovrebbe essere considerato quando si sceglie tra loro e un lambda?
No, questo come viene da Java. Lavorano per migliorare l'esperienza di stack-trace –
Non ho mai sentito uno sviluppatore che chiedesse una traccia di stack più lunga prima ... – Holger