Java 8 流分组(groupingBy)

22

我有一个 List<Map<String, String>>,列表中的每个项都是一个映射,例如:

companyName - IBM
firstName - James
country - USA
...
我想创建一个Map<String, List<String>>,其中将公司名称映射到名字列表,例如:
IBM -> James, Mark
ATT -> Henry, Robert..


private Map<String,List<String>> groupByCompanyName(List<Map<String, String>> list) {
    return list.stream().collect(Collectors.groupingBy(item->item.get("companyName")));
}

但是这将创建一个Map<String, List<Map<String, String>>(将公司名称映射到一组映射)

如何创建一个Map<String, List<String>>

3个回答

35

我没有测试过,但是像这样的东西应该是可以工作的:

Map<String, List<String>> namesByCompany
    = list.stream()
          .collect(Collectors.groupingBy(item->item.get("companyName"),
                   Collectors.mapping(item->item.get("firstName"), Collectors.toList())));

有没有办法获取 String[] 而不是 List<String> - Vinit Solanki
1
我不这么认为(至少不是直接的),因为没有Collectors.toArray方法。@VinitSolanki - Eran

5

您可以使用以下表单:

groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)

即指定下游的映射值作为列表。文档中有很好的例子 (这里)。

downstream 类似于 - mapping(item->item.get(<name>), toList())


0

groupingBy方法返回一个值为列表的Map。如果你想以某种方式处理这些列表,可以提供一个“下游收集器”。

在你的情况下,你不想要一个List作为值,所以需要提供一个下游收集器。

要操作Map,可以使用Collectors文件中的静态方法mapping:

Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper,
                           Collector<? super U, A, R> downstream)

它基本上通过将函数应用于下游结果来生成收集器,并将该函数传递给另一个收集器。
Collectors.mapping(item->item.get("firstName"), Collectors.toList())

这将返回一个下游收集器,它将实现您想要的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接