Java 如何将列表转换为地图地图地图<;字符串,Map<;字符串,对象>&燃气轮机;

Java 如何将列表转换为地图地图地图<;字符串,Map<;字符串,对象>&燃气轮机;,java,collections,hashmap,java-stream,collectors,Java,Collections,Hashmap,Java Stream,Collectors,我有一个列表e,我想将其转换为 Map其中外部字符串应为“Name”,内部字符串应为“Domain” 我尝试了以下几点- e.stream().collect(Collectors.groupingBy( Employee::getName, toMap(Employee::getDomain,Emp))); 因此,预期的输出映射应该如下所示 <Em

我有一个
列表
e,我想将其转换为
Map
其中外部字符串应为“Name”,内部字符串应为“Domain”

我尝试了以下几点-

e.stream().collect(Collectors.groupingBy(
                                   Employee::getName,
                                   toMap(Employee::getDomain,Emp)));
因此,预期的输出映射应该如下所示

<Emp1>
     <Insurance, e(0)>
     <Sales, e(1)>
<Emp2>
     <Sales, e(2)>
<Emp4>
     <Marketing, e(3)>

但我只得到唯一的值,实际输出-

<Emp1>
     <Insurance, e(0)>
<Emp2>
     <Sales, e(2)>
<Emp4>
     <Marketing, e(3)>


有人能告诉你最好的方法吗?

你最想要的是嵌套分组,例如:

Map<String, Map<String, List<Employee>>> groupedMap = employees.stream()
        .collect(Collectors.groupingBy(Employee::getName,
                Collectors.groupingBy(Employee::getDomain, Collectors.toList())));
Map-groupedMap=employees.stream()
.collect(收集器).groupingBy(雇员::getName,
Collectors.groupingBy(Employee::getDomain,Collectors.toList());
注意-这些值是
列表
,分别是按姓名和域分组的员工。(两个相同的俱乐部都加入了一个列表。)


如果您严格要求获得与指定分组对应的单个员工,则代码只需稍加修改即可对我起作用:

Map<String, Map<String, Employee>> groupedReducedMap = employees.stream()
        .collect(Collectors.groupingBy(Employee::getName,
                Collectors.toMap(Employee::getDomain,
                        Function.identity(), // value as the employee instance
                        (a, b) -> a))); // choose first instance for similar 'domain'
Map groupedReducedMap=employees.stream()
.collect(收集器).groupingBy(雇员::getName,
Collectors.toMap(Employee::getDomain,
Function.identity(),//值作为employee实例
(a,b)->a);//为类似的“域”选择第一个实例

因为输出应该是
Map
而不是
Map
(即根据您请求的输出,不能有两名
员工具有相同的姓名和相同的域),您可以按
链接两个
分组,然后使用
减少
,以确保每个内部组将有一个
员工
,而不是一个
列表


现在,我们使用具有标识值的
reduce
的一个变体,我们将一个任意
Employee
实例传递给它(不管是哪个实例,因为它总是被正确的实例替换)。

IIRC,back Holger曾指出,
toMap
groupingBy+reduce
更可取。这里-谢谢,对于所需的数据结构,第二个可以工作
Map<String, Map<String, Employee>> groupedReducedMap = employees.stream()
        .collect(Collectors.groupingBy(Employee::getName,
                Collectors.toMap(Employee::getDomain,
                        Function.identity(), // value as the employee instance
                        (a, b) -> a))); // choose first instance for similar 'domain'
Map<String, Map<String,Optional<Employee>>> output =
    e.stream()
     .collect(Collectors.groupingBy(Employee::getName,
                                    Collectors.groupingBy(Employee::getDomain,
                                                          Collectors.reducing((x1,x2)->x2))));
  Map<String, Map<String,Employee>> output =
      e.stream()
       .collect(Collectors.groupingBy(Employee::getName,
                                      Collectors.groupingBy(Employee::getDomain,
                                                            Collectors.reducing(e.get(0),
                                                                                (x1,x2)->x2))));