2017-10-10 48 views
9

,把具有一個id對象Foo的列表,在Map<Integer,Foo>id爲重點,很容易使用流API:如何使用::運算符,此參考

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

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

有什麼辦法使用::運營商(foo) -> foo的東西:替代lambda表達式?像Foo::this

回答

7

雖然它不是一個方法引用,Function.identity()事情是你所需要的:

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

非常感謝,我試圖找到並沒有成功aswer,但它似乎是一個重複的答案。 – user61002

6

可以使用Function.identity()更換foo -> foo拉姆達。


如果你真的想在於向世人證明方法的參考,你可以寫一個毫無意義的方法

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

和方法參考Util::identity引用它:

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

有一個Function.identity()x -> x非常好之間的差異解釋here,但有時我贊成第二;它不再繁瑣,當管道是複雜我傾向於使用:x -> x