Java流: groupingBy and flatMapping keys

标签 java java-stream flatmap

假设我有一个国家/地区对象列表,其中包含该国家/地区使用的语言列表,如下所示:

class Country {
    List<String> languages; 
}

我想创建以下格式的 map : Map<String, List<Country>> ,这样每种语言都会映射到 Country 对象的列表。例如:

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

最佳答案

由于您似乎关心性能,因此不要使用流来完成这个简单的任务:

Map<String, List<Country>> countriesByLanguage = new HashMap<>();
for (Country country : countries) {
    for (String language : country.getLanguages()) {
        countriesByLanguage.computeIfAbsent(language, k -> new ArrayList<>())
                           .add(country);
    }
}

关于Java流: groupingBy and flatMapping keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55360374/

相关文章:

java - 了解 playframework 中的验证

java - 如何从实例中获取供应商?

java - 按键将对象列表分组到具有唯一对象子列表的列表中(使用java流)

Scala:带元组的 flatMap

Scala - 访问 map 或平面 map 中的集合成员

Java + ResultSet.getObject()

java.lang.IllegalArgumentException : white space not allowed 异常

scala打印字长直方图scala

java - java 中 PDF 文件的文档模板(寻找工具/库)

java - 如何获取流的最大索引值