Tôi vừa thực hiện một thử nghiệm nhanh trong Eclipse.Dấu vết ngăn xếp có ít điều hướng hơn khi sử dụng tham chiếu phương thức so với lambdas không?
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();
}
}
Khi thử nghiệm phương pháp tham chiếu không thành công, dấu vết bắt đầu
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)
Không có tài liệu tham khảo về dòng mà trên đó các tài liệu tham khảo phương pháp được sử dụng mặc dù cuối của các dấu vết (không hiển thị) liên kết ngược lại với dòng findFirst
vào.
Trong khi stacktrace lamdba bắt đầu
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)
nào xác định một cách chính xác các lambda được sử dụng trên dòng 26.
Đây có phải là một nét đặc biệt của trình biên dịch Eclipse hoặc đây là một nhược điểm chung của việc sử dụng tài liệu tham khảo phương pháp mà nên được cân nhắc khi lựa chọn giữa chúng và lambda?
Không, cách này đến từ Java. Họ làm việc để cải thiện trải nghiệm theo dõi ngăn xếp –
Tôi chưa bao giờ nghe một nhà phát triển yêu cầu một dấu vết ngăn xếp lâu hơn trước đây… – Holger