Lambda 值为ArrayList的Java 8 Collectors.toMap

Lambda 值为ArrayList的Java 8 Collectors.toMap,lambda,java-8,java-stream,Lambda,Java 8,Java Stream,我想使用Java8将给定的2d数组转换为map。 输入-{1,0},{2,0},{3,1},{3,2} 输出应该是形式化的 Map Map=newhashmap(); 输出-{1=[0],2=[0],3=[1,2]} 下面是我的解决方案 for (int[] prereq : prerequisites) { map.computeIfAbsent(prereq[0], k -> new ArrayList<>()).add(prereq[1]);

我想使用Java8将给定的2d数组转换为map。 输入-{1,0},{2,0},{3,1},{3,2} 输出应该是形式化的 Map Map=newhashmap(); 输出-{1=[0],2=[0],3=[1,2]}

下面是我的解决方案

for (int[] prereq : prerequisites) {
            map.computeIfAbsent(prereq[0], k -> new ArrayList<>()).add(prereq[1]);
        }
for(int[]prereq:先决条件){
computeIfAbsent(prereq[0],k->newArrayList()).add(prereq[1]);
}

任何更好的方法,如果for循环可以替换为streams。

要按键收集到包含多个值的映射,请使用
收集器。groupingBy

int[][] prerequisites = {{1, 0}, {2, 0}, {3, 1}, {3, 2}};
Map<Integer, List<Integer>> res = Arrays.stream(prerequisites).collect(
        Collectors.groupingBy(x -> x[0], Collectors.mapping(x -> x[1], Collectors.toList())));

要按键收集到包含多个值的映射中,请使用
收集器。groupingBy

int[][] prerequisites = {{1, 0}, {2, 0}, {3, 1}, {3, 2}};
Map<Integer, List<Integer>> res = Arrays.stream(prerequisites).collect(
        Collectors.groupingBy(x -> x[0], Collectors.mapping(x -> x[1], Collectors.toList())));

由于数组行总是由一对数字组成,并且将第一个元素视为关键字,第二个元素作为值,如果将它们映射到<代码> SimeEnguts<代码>:

,这将是显而易见的。
int[][] prerequisites = { { 1, 0 }, { 2, 0 }, { 3, 1 }, { 3, 2 } };
    Map<Integer,List<Integer>> map = 
            Arrays.stream(prerequisites)
                  .map(arr -> new AbstractMap.SimpleEntry<>(arr[0], arr[1]))
                  .collect(Collectors.groupingBy(
                            Map.Entry::getKey,
                            Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
int[][]先决条件={{1,0},{2,0},{3,1},{3,2};
地图=
Arrays.stream(先决条件)
.map(arr->newAbstractMap.SimpleEntry(arr[0],arr[1]))
.collect(收集器.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,Collectors.toList());

因为你的数组行总是由一对数字组成,你把第一个元素视为关键字,第二个元素作为值,如果你把它们映射到<代码> SimeEnguts<代码>:

,这将是显而易见的。
int[][] prerequisites = { { 1, 0 }, { 2, 0 }, { 3, 1 }, { 3, 2 } };
    Map<Integer,List<Integer>> map = 
            Arrays.stream(prerequisites)
                  .map(arr -> new AbstractMap.SimpleEntry<>(arr[0], arr[1]))
                  .collect(Collectors.groupingBy(
                            Map.Entry::getKey,
                            Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
int[][]先决条件={{1,0},{2,0},{3,1},{3,2};
地图=
Arrays.stream(先决条件)
.map(arr->newAbstractMap.SimpleEntry(arr[0],arr[1]))
.collect(收集器.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,Collectors.toList());

您的方法看起来不错。如果您使用java 9+并且不打算更改列表,那么在这种情况下,您可以执行以下更改
map.computefabsent(prereq[0],k->list.of(prereq[1]);
您的方法看起来不错。如果您使用java 9+并且不打算更改列表,在这种情况下,您可以执行以下更改
map.computefabsent(prereq[0],k->List.of(prereq[1]);
Map res=Arrays.stream(先决条件).collect(收集器.toMap(x->x[0],x->Arrays.asList(x[1]),(x1,x2)->Arrays.asList(x1.get(0),x2.get(0)))@ShashankAgrawal实际groupingBy是更好的选择,当map键有多个值时,toMap通常用于单值映射,当您需要自己的合并函数时。阅读更多详细信息map res=Arrays.stream(先决条件)。collect(Collectors.toMap(x->x[0],x->Arrays.asList(x[1]),(x1,x2)->Arrays.asList(x1.get(0),x2.get(0)));@ShashankAgrawal Acutually groupingBy是更好的选择,当map键有多个值时,toMap通常用于单值映射,当您需要自己的合并函数时。阅读更多详细信息我认为也一样乍一看我的第一个解决方案完全相同。我认为也一样乍一看我的第一个解决方案完全相同.