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]]
在列表上的 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]]