Потоки Java: ключи groupingBy и flatMapping - PullRequest
1 голос
/ 26 марта 2019

Скажем, у меня есть список объектов страны, которые содержат списки языков, на которых говорят в этой стране, например:

class Country {
    List<String> languages; 
}

Я хотел бы создать карту в следующем формате: Map<String, List<Country>>, так что каждый язык отображается в список объектов Country. E.g.:

"French" -> [Country:France, Country:Canada],
"English" -> [Country:UK, Country:US]

Производительность является проблемой здесь, поэтому я хотел бы избежать нескольких итераций и поисков. Я пытался использовать groupingBy, но как мне flatMap набор ключей?

Пример, это приводит к Map<List<String>, List<Country>>:

countries.stream()
    .collect(Collectors.groupingBy(country -> country.getLanguages(), toList()));

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Поскольку вы, похоже, заботитесь о производительности, не используйте потоки для этой простой задачи:

Map<String, List<Country>> countriesByLanguage = new HashMap<>();
for (Country country : countries) {
    for (String language : country.getLanguages()) {
        countriesByLanguage.computeIfAbsent(language, k -> new ArrayList<>())
                           .add(country);
    }
}
0 голосов
/ 26 марта 2019

Это будет сделано:

    countries.stream()
             .flatMap(country -> country.getLanguages()
                                        .stream()
                                        .map(lang -> new SimpleEntry<>(lang, new ArrayList<>(Arrays.asList(country)))))
             .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (l1, l2) -> {
                 l1.addAll(l2);
                 return l2;
             }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...