J'ai un problème particulier et je me demandais si l'API Java 8 Streams pourrait le résoudre. Je sais que cela peut être fait en dehors de l'utilisation de l'API Streams mais je ne veux pas ajouter tout le code associé à boilerplate essayer d'y parvenir, si cela peut être fait en utilisant des ruisseaux. J'ai une carte
Map<String, String> greetings = new HashMap<>();
greetings.put("abc", "Hello");
greetings.put("def", "Goodbye");
greetings.put("ghi", "Ciao");
greetings.put("xyz", "Bonsoir");
et une liste de clés:
List<String> keys = Arrays.asList("def", "zxy");
et l'utilisation ci-dessus avec l'API Streams, est-il possible de filtrer que jusqu'à:
Map<String, String> filteredGreetings = new HashMap<>();
filteredGreetings.put("def", "Goodbye");
filteredGreetings.put("xyz", "Bonsoir");
Espérons que cela a un sens ce que je suis en train de réaliser.
Jusqu'à présent, j'ai que cela fonctionne uniquement lorsque vous spécifiez la clé exacte qui pour filtrer keySet, mais de la carte alors ce ne reviendrait un ensemble unique d'entrée. Je suis intéressé par une carte complètement filtrée vers le bas et je me bats pour y parvenir.
Essaye ça:
Map<String, String> result = keys.stream()
.filter(greetings::containsKey)
.collect(Collectors.toMap(Function.identity(), greetings::get));
Ou l'inverse:
Map<String, String> result = greetings.entrySet().stream()
.filter(e -> keys.contains(e.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Pour la deuxième approche que je vous conseille d' utiliser une Set<String>
pour une plus grande liste de keys
car il a un O (1) la complexité du temps .contains()
car il ne contient pas de doublons:
Set<String> keys = new HashSet<>(Arrays.asList("def", "zxy"));