web-dev-qa-db-fra.com

Collectors.toMap () keyMapper - une expression plus succincte?

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

List<Person> roster = ...;

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

Il semble que je devrais être capable de le mettre en ligne en utilisant une expression lambda, mais je ne peux pas en trouver une qui compile. (Je suis assez nouveau chez lambdas, alors ce n'est pas vraiment une surprise.)

Merci.

-> Mise à jour:

Comme indiqué dans la réponse acceptée

Person::getLast

c'est ce que je cherchais et c'est quelque chose que j'avais essayé. Cependant, le problème était dû à la construction nocturne de Eclipse 4.3 par BETA_8, qui l’a signalé comme étant faux. Compilé à partir de la ligne de commande (ce que j'aurais dû faire avant de poster), cela a fonctionné. Il est donc temps de déposer un bogue avec Eclipse.org.

Merci.

71
pfurbacher

Vous pouvez utiliser un lambda:

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

ou plus simplement, vous pouvez utiliser un référence de la 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 indications chaque fois qu'une classe anonyme peut être remplacée par un lambda.

177
assylias
List<Person> roster = ...;

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

ce serait la traduction, mais je n'ai ni exécuté ceci ni utilisé l'API. très probablement, vous pouvez remplacer p -> p par Function.identity (). et importer statiquement toMap (...)

27
aepurniet

Nous pouvons utiliser une fonction de fusion facultative également en cas de même collision de 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 IllegalStateException. Voici l'exemple pour y parvenir ...

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