2016-02-19 32 views
6

Sonar nói với tôi "Thay thế lambda này với một tài liệu tham khảo phương pháp"SONAR: Thay thế lambda này với một phương pháp tham chiếu

public class MyClass { 

    private List<SomeValue> createSomeValues(List<Anything> anyList) { 
     return anyList // 
       .stream() // 
       .map(anything -> createSomeValue(anything)) // 
       .collect(Collectors.toList()); 
    } 

    private SomeValue createSomeValue(Anything anything) { 
     StatusId statusId = statusId.fromId(anything.getStatus().getStatusId()); 
     return new SomeValue(anything.getExternId(), statusId); 
    } 

} 

Đây có phải là có thể ở đây? Tôi đã thử một vài điều, như

.map(MyClass::createSomeValue) // 

nhưng tôi cần phải thay đổi phương thức thành tĩnh rồi. Và tôi không phải là một fan hâm mộ lớn của phương pháp tĩnh.

Giải thích về SonarQube là:

tài liệu tham khảo Phương pháp/constructor là nhỏ gọn hơn và dễ đọc hơn là sử dụng lambdas, và do đó được ưa thích.

Trả lời

10

Có, bạn có thể sử dụng this::createSomeValue:

private List<SomeValue> createSomeValues(List<Anything> anyList) { 
    return anyList // 
      .stream() // 
      .map(this::createSomeValue) // 
      .collect(Collectors.toList()); 
} 

Loại method reference được gọi "Reference to an instance method of a particular object". Trong trường hợp này, bạn đang tham chiếu đến phương thức createSomeValue của cá thể this.


Cho dù đó là "tốt hơn" hoặc không sử dụng biểu thức lambda là vấn đề quan điểm. Tuy nhiên, bạn có thể tham khảo this answer được viết bởi Brian Goetz giải thích tại sao phương pháp tham chiếu phương pháp được thêm vào ngôn ngữ ở địa điểm đầu tiên.

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