2017-10-10 1 views
9

Converting Foo ein id haben, zu einem Map<Integer,Foo> mit diesen id als Schlüssel, ist einfach, den Stream-API:Wie eine Liste von Objekten verwenden :: operator als diese Referenz

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

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

Gibt es eine Möglichkeit zu Ersetzen Sie den Lambda-Ausdruck: (foo) -> foo mit etwas mit dem :: Operator? So etwas wie Foo::this

Antwort

7

Während es keine Methode Referenz, Function.identity() ist, was Sie brauchen:

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

Vielen Dank, ich habe versucht zu finden und zu prüfen, ohne Erfolg, aber es scheint eine doppelte Antwort zu sein. – user61002

6

Sie können die Function.identity() verwenden, um ein foo -> foo Lambda zu ersetzen.

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

Es gibt ein:


Wenn Sie wirklich eine Methode Bezug auf demostrate möchten, können Sie eine bedeutungslose Methode

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

und beziehen sich auf sie durch die Methode Referenz Util::identity schreiben Unterschied zwischen Function.identity() und als sehr gut erklärt here, aber manchmal bevorzuge ich die zweite; es ist weniger wortreich und wenn die Pipeline kompliziert ist, neige ich dazu, zu verwenden:

Verwandte Themen