Bạn không thể thay thế lambda input -> getValueProvider().apply(input).getValue()
bằng tham chiếu phương thức mà không thay đổi ngữ nghĩa.
Tham chiếu phương thức thay thế một lời gọi phương thức đơn, do đó, nó không thể thay thế biểu thức lambda đơn giản bao gồm nhiều lời gọi phương thức.
Biểu thức lambda của biểu mẫu input -> getValueProvider().apply(input)
có thể được thay thế bằng getValueProvider()::apply
nếu và chỉ khi thời gian đánh giá getValueProvider()
không quan trọng như ở dạng lambda phương pháp được gọi trên mỗi đánh giá cơ thể lambda trong khi tham chiếu phương pháp chỉ được gọi một lần và kết quả được capture.
Điều này tương tự như sự khác biệt giữa x -> System.out.println(x)
và System.out::println
khi đọc nội dung của trường System.out
xảy ra vào các thời điểm khác nhau nhưng thường không quan trọng. Nhưng bạn nên nhận thức được sự khác biệt.
Trong ví dụ của bạn, phương thức thứ ba getValue()
được gọi. Cách duy nhất để thể hiện rằng với các tham chiếu phương thức cần một giao diện chức năng như Function
có các phương thức như andThen
và/hoặc compose
. Tuy nhiên, cách Java 8 hoạt động, điều đó sẽ yêu cầu truyền tham chiếu phương thức đầu tiên đến giao diện đích để gọi phương thức kết hợp sẽ không dễ dàng hơn khi đọc biểu thức lambda bạn hiện có: ((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)
trong đó Y
là loại, apply(input)
trả về. Lưu ý rằng quy tắc cho biết "Thay thế lambdas bằng tham chiếu phương thức khi có thể", cho phép bạn nói, "tốt, ở đây là không thể", tuy nhiên, tôi không chắc bạn có thể gọi nó là bao nhiêu “Quy tắc” sau đó…
Sẽ dễ dàng hơn nếu bạn đăng thêm mã ... –