2014-09-01 34 views
8

mẫu mã nàySonar: Thay thế lambda này với một tài liệu tham khảo phương pháp

Collection<Number> values = transform(
     getValuatedObjects(), 
     input -> getValueProvider().apply(input).getValue()); 

vi phạm sonarqube rule:

Thay lambdas với sự tham khảo phương pháp khi có thể

nó là một lỗi sonar ? hoặc tôi có thể thực sự sử dụng tham chiếu phương pháp không?

+0

Sẽ dễ dàng hơn nếu bạn đăng thêm mã ... –

Trả lời

16

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)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 đó…

+0

Cảm ơn câu trả lời này. Vì vậy, chúng ta có thể nói rằng đó là một lỗi sonar. – gontard

+2

Xin chào, tôi xác nhận đây thực sự là một kết quả dương tính giả. Vé đã được tạo để sửa lỗi này: https://jira.codehaus.org/browse/SONARJAVA-640 – benzonico

+0

cập nhật liên kết cũ tới vấn đề: https://jira.sonarsource.com/browse/SONARJAVA-640 – benzonico

Các vấn đề liên quan