带有字符串列表的Java流收集器.groupingBy()

带有字符串列表的Java流收集器.groupingBy(),java,java-8,Java,Java 8,我有以下课程: Class Foo{ private String cassette; private List<String> organs; //["Lung","Liver"] //getter setter } Class-Foo{ 私人弦乐磁带; 私人器官清单;//[“肺”、“肝”] //吸气剂设定器 } 我正在将数据收集到列表中,我想按器官将它们分组为地图 到目前为止,我尝试了以下解决方案: Map<Object, List<Foo>&g

我有以下课程:

Class Foo{
  private String cassette;
  private List<String> organs; //["Lung","Liver"]
  //getter setter
}
Class-Foo{
私人弦乐磁带;
私人器官清单;//[“肺”、“肝”]
//吸气剂设定器
}
我正在将数据收集到
列表
中,我想按器官将它们分组为
地图

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

Map<Object, List<Foo>> collect = fooList
                                   .stream()
                                   .collect(Collectors.groupingBy(x -> x.getOrgan()));
Map collect=傻瓜
.stream()
.collect(collector.groupingBy(x->x.getOrgane());
它返回
Map
而不是
Map
,如下所示:

{[肺,肝]=[Foo[盒=1A,器官=[肺,肝]]],[肝]=[Foo [盒式磁带=2A,器官=[肝脏]]}


另外,当我只为
收集器传递
类型的分组键时,如何生成一个返回
Map
的通用方法。groupingBy(T)
,它将按指定键分组您是按
列表而不是按
字符串进行分组的。要按
字符串进行分组
您必须对
流进行预处理
以首先获得(字符串,Foo)的所有对:

Map collect=
傻瓜
.flatMap(f->f.getOrgane().stream().map(o->new SimpleEntry(o,f)))
.collect(Collectors.groupingBy(Map.Entry::getKey、,
Collectors.mapping(Map.Entry::getValue,
收藏家;

因为这是您声明它的方式:
Map collect
您正在将
Map
分组为
getOrgans()
返回
List
@KunLun如果我将其设置为
Map
我会遇到编译器错误,即
类型不匹配:可能无法从Map转换为Map
,因为
getorganger()
已声明返回
对象
。我们怎么知道…@Holger你是对的,但这不是重点,问题在于
列表的分组,这里解决了这个问题
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())));