Java 流 Collectors.groupingBy() 与字符串列表

标签 java java-8

我有以下类(class):

Class Foo{
  private String cassette;
  private List<String> organs; //["Lung","Liver"]
  //getter setter
}

我正在将数据收集到 List<Foo>我想按器官将它们分组为 Map<String,List<Foo>>

到目前为止,我已经尝试过以下解决方案:

Map<Object, List<Foo>> collect = fooList
                                   .stream()
                                   .collect(Collectors.groupingBy(x -> x.getOrgan()));

它返回Map<Object, List<Foo>>而不是Map<String,List<Foo>>如下:

{[Lung, Liver]=[Foo [cassette=1A, organ=[Lung, Liver]]], [Liver]=[Foo [cassette=2A, organ=[Liver]]]}

另外,我怎样才能创建一个返回 Map<String,List<Foo>> 的通用方法?当我仅传递 Type<T> 分组的 key 时对于 Collectors.groupingBy(T)它将按指定的键分组

最佳答案

您正在按 List<String> 进行分组,不是由String 。按 String 分组你必须预处理 Stream首先获取 (String,Foo) 的所有对:

Map<String,List<Foo>> collect = 
    fooList.stream()
           .flatMap(f -> f.getOrgan().stream().map(o -> new SimpleEntry<>(o,f)))
           .collect(Collectors.groupingBy(Map.Entry::getKey,
                                          Collectors.mapping(Map.Entry::getValue,
                                                             Collectors.toList())));

关于Java 流 Collectors.groupingBy() 与字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60299992/

相关文章:

java - 如何设计:避免在随机访问文件时资源泄漏

java - 如何在 Java 8 中将 LocalDateTime 转换为 Date

functional-programming - java8流样式将键值列表转换为 map ?

java - Stream sorted() 导致意外结果

java - 在被调用方法中查找方法调用者

java - 在Java中逐个元素地求和两个数组

java - 哎呀。 conf/routes 或 conf/application.conf 丢失。?

java - Maven 构建 war 在 Tomcat 7 上无法正常工作

java - 无法在 lambda 表达式内触发异常

java - 创建一个组合来自并行数组的项目的流