Использование фильтра «Стримы» Карта на основе списка ключей - PullRequest
4 голосов
/ 14 июня 2019

У меня есть конкретная проблема, и мне было интересно, сможет ли ее решить API Java 8 Streams.Я знаю, что это можно сделать вне использования Streams API, но я не хочу добавлять весь шаблонный код, связанный с попытками добиться этого, если это можно сделать с помощью Streams.У меня есть карта

Map<String, String> greetings = new HashMap<>();
greetings.put("abc", "Hello");
greetings.put("def", "Goodbye");
greetings.put("ghi", "Ciao");
greetings.put("xyz", "Bonsoir");

и список ключей:

List<String> keys = Arrays.asList("def", "zxy");

, и, используя вышеуказанное с Streams API, можно отфильтровать это до:

Map<String, String> filteredGreetings = new HashMap<>();
filteredGreetings.put("def", "Goodbye");
filteredGreetings.put("xyz", "Bonsoir");

Надеюсь, в этом есть смысл того, чего я пытаюсь достичь.

До сих пор это работало только при указании точного ключа, по которому нужно отфильтровать набор ключей карты, но тогда он будет возвращать только один набор записей.Меня интересует полностью отфильтрованная карта, и я изо всех сил пытаюсь достичь этого.

Ответы [ 3 ]

4 голосов
/ 14 июня 2019

Если ввод и ожидаемый вывод в вопросе не являются опечаткой , вы также можете сохранить ключи карты ввода как:

Map<String, String> futureGreetings = new HashMap<>(greetings);
futureGreetings.keySet().retainAll(keys);
3 голосов
/ 14 июня 2019

Попробуйте это:

Map<String, String> result = keys.stream()
        .filter(greetings::containsKey)
        .collect(Collectors.toMap(Function.identity(), greetings::get));

Или наоборот:

Map<String, String> result = greetings.entrySet().stream()
        .filter(e -> keys.contains(e.getKey()))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Для второго подхода я бы рекомендовал использовать Set<String> для большего списка keys, потому что он имеет O (1) сложность времени для .contains(), потому что не содержит дубликатов:

Set<String> keys = new HashSet<>(Arrays.asList("def", "zxy"));
0 голосов
/ 14 июня 2019

Попробуйте это

filteredGreetings= keys.stream()
                  .collect(Collectors.toMap(Function.identity(),key->greetings.get(key)));

или даже при отсутствии ключа вы можете использовать метод getOrDefault().

... .collect(Collectors.toMap(Function.identity(),key->greetings.getOrDefault(key,"")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...