2017-10-10 38 views
9

Chuyển đổi một danh sách các đối tượng Foo có một id, đến một Map<Integer,Foo> với điều đó id như chìa khóa, rất dễ dàng sử dụng API dòng:Làm thế nào để sử dụng :: operator như tài liệu tham khảo này

public class Foo{ 
    private Integer id; 
    private .... 
    getters and setters... 
} 

Map<Integer,Foo> myMap = 
fooList.stream().collect(Collectors.toMap(Foo::getId, (foo) -> foo)); 

Có cách nào để thay thế biểu thức lambda: (foo) -> foo bằng cách sử dụng toán tử ::? Một cái gì đó như Foo::this

Trả lời

7

Trong khi nó không phải là một tài liệu tham khảo phương pháp, Function.identity() là những gì bạn cần:

Map<Integer,Foo> myMap = 
    fooList.stream().collect(Collectors.toMap(Foo::getId, Function.identity())); 
+0

Cảm ơn rất nhiều, tôi đã cố gắng tìm và aswer mà không thành công, nhưng nó có vẻ là một câu trả lời trùng lặp. – user61002

6

Bạn có thể sử dụng Function.identity() để thay thế một lambda foo -> foo.


Nếu bạn thực sự muốn demostrate một tài liệu tham khảo phương pháp, bạn có thể viết một phương pháp vô nghĩa

class Util { 
    public static <T> T identity(T t) { return t; } 
} 

và gọi nó bằng các tài liệu tham khảo phương pháp Util::identity:

(...).stream().collect(Collectors.toMap(Foo::getId, Util::identity)); 
4

Có một sự khác biệt giữa Function.identity()x -> x như được giải thích rất tốt here, nhưng đôi khi tôi ưu tiên thứ hai; nó ít tiết và khi đường ống phức tạp, tôi có xu hướng sử dụng: x -> x

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