Java8:减少元素列表,如sql group by

Java8: Reduce list of elements like sql group by

在列表上的 stream().filter().map() 之后,我有一个 List<List<Object>> 类型的数据结构,如下所示:

[["1","a",20],
 ["1","b",10],
 ["2","a",10],
 ["2","b",30]]

我想要的是按内部列表第一个元素的值分组,去掉中间元素,最后对每个 "group".

的最后一个元素求和
[["1", 30],
 ["2", 40]]

抱歉,如果这对你们中的一些人来说很明显,但我还没有找到任何示例来说明如何实现这一点。我假设它可以通过 Stream.reduce(U identity, BiFunction accumulator, BinaryOperator combiner) 来完成,但到目前为止我还没有成功。如果有人可以为此提供一些示例代码,我相信其他人也会很感激。

以下代码可能会有帮助:

List<List<Object>> originalList = Arrays.asList(
        Arrays.asList("1", "a", 20),
        Arrays.asList("1", "b", 10),
        Arrays.asList("2", "a", 10),
        Arrays.asList("2", "b", 30)
);

final Map<Object, Integer> collectedMap =
        originalList.stream()
                .collect(Collectors.groupingBy(
                        e -> e.get(0),
                        Collectors.summingInt(e -> (Integer) e.get(2))));

System.out.println(collectedMap);

输出为:

{1=30, 2=40}

基本上,代码所做的是 group 子列表中的第一个值 (get(0))。然后它使用 summingInt 对整数求和。但是,它将整个事物分组在一个 Map 中 - 如果需要一些其他集合,则必须稍微更改流。

例如将整个东西收集为 List:

final List<List<Object>> collectedList =
    collectedMap.entrySet()
             .stream()
             .map(e -> Arrays.asList(e.getKey(), e.getValue()))
             .collect(Collectors.toList());

System.out.println(collectedList);

那么,输出将是:

[[1, 30], [2, 40]]