2017-10-10 17 views
9

Conversion d'une liste d'objets Foo ayant un id, à un Map<Integer,Foo> avec cette id comme la clé, est facile en utilisant l'API de flux:Comment utiliser :: opérateur cette référence

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

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

Est-il possible de substituer l'expression lambda: (foo) -> foo avec quelque chose en utilisant l'opérateur ::? Quelque chose comme Foo::this

Répondre

7

Bien qu'il n'est pas une référence de méthode, Function.identity() est ce que vous avez besoin:

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

Merci beaucoup, j'ai essayé de trouver et d'aswer sans succès, mais il semble être une réponse en double. – user61002

6

Vous pouvez utiliser le Function.identity() pour remplacer un foo -> foo lambda.


Si vous voulez vraiment demostrate une référence de méthode, vous pouvez écrire une méthode vide de sens

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

et s'y référer par la référence de la méthode Util::identity:

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

Il y a un différence entre Function.identity() et x -> x comme très bien expliqué here, mais parfois je favorise la seconde; c'est moins verbeux et quand le pipeline est compliqué j'ai tendance à utiliser: x -> x