Java8流分组

Java8流分组,java,lambda,java-8,Java,Lambda,Java 8,我有列表列表中的每个项目都是一张地图,例如 companyName - IBM firstName - James country - USA ... 我想创建一个映射,将companyName映射到firstName列表 e、 g IBM->James,Mark ATT->亨利,罗伯特。。 私有映射groupByCompanyName(列表){ return list.stream().collect(收集器.groupingBy(item->item.get(“companyName”))

我有
列表
列表中的每个项目都是一张地图,例如

companyName - IBM
firstName - James
country - USA
...
我想创建一个
映射
,将companyName映射到firstName列表 e、 g

IBM->James,Mark
ATT->亨利,罗伯特。。
私有映射groupByCompanyName(列表){
return list.stream().collect(收集器.groupingBy(item->item.get(“companyName”));
}
但这将创建
Map您可以使用以下表单:

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

groupingBy(函数尚未对其进行测试,但类似的方法应该可以工作:

Map<String, List<String>> namesByCompany
    = list.stream()
          .collect(Collectors.groupingBy(item->item.get("companyName"),
                   Collectors.mapping(item->item.get("firstName"), Collectors.toList())));
按公司映射名称
=list.stream()
.collect(Collectors.groupingBy(item->item.get(“companyName”),
Collectors.mapping(item->item.get(“firstName”)、Collectors.toList());

groupingBy方法生成一个值为列表的映射。如果您想以某种方式处理这些列表,请提供一个“下游收集器” 在您的情况下,您不希望列表作为值,因此需要提供一个下游收集器

要操作映射,可以使用收集器文件中的静态方法映射:

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

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

有没有办法获取
String[]
而不是
List
我不这么认为(至少不直接),因为没有
收集器。toArray
方法。@VinitSolanki
Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper,
                           Collector<? super U, A, R> downstream)
Collectors.mapping(item->item.get("firstName"), Collectors.toList())