Java 8 Streams-Cartes cartographiques


Étant Donné que nous avons la fonction suivante:

public Map<String, List<String>> mapListIt(List<Map<String, String>> input) {
    Map<String, List<String>> results = new HashMap<>();
    List<String> things = Arrays.asList("foo", "bar", "baz");

    for (String thing : things) {
        results.put(thing, input.stream()
                                 .map(element -> element.get("id"))
                                 .collect(Collectors.toList()));
    }

    return results;
}

Existe-t-il un moyen de nettoyer cela en liant "id" à une référence de méthode Map::get?

Existe-t-il un moyen plus stream-y d'écrire cette fonctionnalité?

Author: Tagir Valeev, 2015-09-02

1 answers

Pour autant que je sache ce que vous avez l'intention, c'est que cette fonction renvoie une carte d'une liste définie de chaînes à une liste de tous les éléments avec la clé "id" dans une liste de cartes d'entrée. Est-ce exact?

Si c'est le cas, cela pourrait être considérablement simplifié car la valeur de toutes les clés sera la même:

public Map<String, List<String>> weirdMapFunction(List<Map<String, String>> inputMaps) {
    List<String> ids = inputMaps.stream()
        .map(m -> m.get("id")).collect(Collectors.toList());
    return Stream.of("foo", "bar", "baz")
        .collect(Collectors.toMap(Function.identity(), s -> ids));
}

Si vous souhaitez utiliser une référence de méthode (qui est mon interprétation de votre question sur 'binding'), vous aurez besoin d'une méthode distincte pour référencer:

private String getId(Map<String, String> map) {
    return map.get("id");
}

public Map<String, List<String>> weirdMapFunction(List<Map<String, String>> inputMaps) {
    List<String> ids = inputMaps.stream()
        .map(this::getId).collect(Collectors.toList());
    return Stream.of("foo", "bar", "baz")
        .collect(Collectors.toMap(Function.identity(), s -> ids));
}

Cependant je suis deviner que vous aviez l'intention d'utiliser les éléments de la liste comme clés (plutôt que "id"), auquel cas:

public Map<String, List<String>> weirdMapFunction(List<Map<String, String>> inputMaps) {
    return Stream.of("foo", "bar", "baz")
        .collect(Collectors.toMap(Function.identity(), s -> inputMaps.stream()
            .map(m -> m.get(s)).collect(Collectors.toList())));
}
 4
Author: sprinter, 2015-09-03 04:32:08