Utilisation de filtre Streams carte basée sur une liste de clés

Richard C:

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.

Samuel Philipp:

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 keyscar 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"));

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=226840&siteId=1
conseillé
Classement