Collectors.toMap () keyMapper – expression plus succincte?

J’essaie de trouver une expression plus succincte pour le paramètre de fonction “keyMapper” dans l’appel Collectors.toMap() :

 List roster = ...; Map map = roster .stream() .collect( Collectors.toMap( new Function() { public Ssortingng apply(Person p) { return p.getLast(); } }, Function.identity())); 

Il semble que je devrais pouvoir l’inclure en utilisant une expression lambda, mais je ne peux pas en trouver une qui comstack. (Je suis tout à fait nouveau à lambdas, donc ce n’est pas une grande surprise.)

Merci.

-> Mise à jour:

Comme indiqué dans la réponse acceptée

 Person::getLast 

est ce que je cherchais et c’est quelque chose que j’ai essayé. Cependant, le problème était dû à la version BETA_8 d’Eclipse 4.3, qui était considérée comme incorrecte. Lorsque compilé à partir de la ligne de commande (ce que j’aurais dû faire avant de poster), cela a fonctionné. Donc, le temps de déposer un bug avec eclipse.org.

Merci.

Vous pouvez utiliser un lambda:

 Collectors.toMap(p -> p.getLast(), Function.identity()) 

ou, plus concis, vous pouvez utiliser une référence de méthode en utilisant ::

 Collectors.toMap(Person::getLast, Function.identity()) 

et au lieu de Function.identity , vous pouvez simplement utiliser l’équivalent lambda:

 Collectors.toMap(Person::getLast, p -> p) 

Si vous utilisez Netbeans, vous devriez obtenir des indices chaque fois qu’une classe anonyme peut être remplacée par une lambda.

 List roster = ...; Map map = roster .stream() .collect( Collectors.toMap(p -> p.getLast(), p -> p) ); 

ce serait la traduction, mais je n’ai pas exécuté ceci ni utilisé l’API. très probablement, vous pouvez substituer p -> p, pour Function.identity (). et importer statiquement vers (…)

Nous pouvons utiliser une fonction de fusion optionnelle également en cas de collision par clé. Par exemple, si deux personnes ou plus ont la même valeur getLast (), nous pouvons spécifier comment fusionner les valeurs. Si nous ne le faisons pas, nous pourrions obtenir une exception IllegalStateException. Voici l’exemple pour y parvenir …

 Map map = roster .stream() .collect( Collectors.toMap(p -> p.getLast(), p -> p, (person1, person2) -> person1+";"+person2) );