使用java流将List <int []>更改为Map <int [],int []>

时间:2015-08-17 06:50:01

标签: java java-8 java-stream

假设我有

{{1}}

我需要将其转换为

{{1}}

有效地,map的关键是常数值,直到数组长度为2,值应该包含所有这些数组的最后一个元素。

有人可以建议我如何使用java流来获取它,因为在正常的循环中,所有这些都是非常复杂的事情吗?

1 个答案:

答案 0 :(得分:7)

首先,将数组用作Map密钥是一个非常糟糕的主意,因为它们的hashCodeequals方法基于对象标识,而不是基于数组内容。我建议将输入数据改为List<List<Integer>>

List<List<Integer>> lists = Arrays.asList(Arrays.asList(1,2,3), Arrays.asList(1,2,4),
        Arrays.asList(1,2,7),Arrays.asList(1,3,1),Arrays.asList(2,2),
        Arrays.asList(1,2,8),Arrays.asList(1,3,4),Arrays.asList(2,3));

使用级联groupingBy

可以很容易地解决您的任务
Map<List<Integer>, List<Integer>> result = lists.stream().collect(
        Collectors.groupingBy(list -> list.subList(0, list.size() - 1),
            Collectors.mapping(list -> list.get(list.size() - 1),
                Collectors.toList())));

元素按列表前缀(除最后一个之外的所有元素)进行分类,然后在下游缩减期间,最后一个列表元素被提取并收集到列表中。

结果:

System.out.println(result);

{[2]=[2, 3], [1, 2]=[3, 4, 7, 8], [1, 3]=[1, 4]}
相关问题