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é?
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())));
}