将流映射到具有总计的对象列表

时间:2021-07-16 02:39:20

标签: java lambda java-8 java-stream reduce

我有一个 Map 是从这个代码中得到的

Map<String, Long> countsMap = sampleObjectList.stream()
        .collect(Collectors.groupingBy(sampleObject::getStatus, Collectors.counting()));

获取地图后,我需要创建一个对象列表,其中包含每个状态的计数和总计数。

我使用下面的 for 循环执行此操作的正常方法。

List<ObjectCountDTO> dtoList = new ArrayList<>();
long allCount = 0L;
for(Map.Entry<String, Long> entry : countsMap.entrySet()) {
    long count = entry.getValue();
    allCount += count;
    dtoList.add(new ObjectCountDTO(entry.getKey(), count)); 
}
dtoList.add(new ObjectCountDTO("ALL", allCount));

有没有办法在 java 8 中使用流来做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以stream频率entrySet的{​​{1}}。

Map

答案 1 :(得分:0)

如果你想在一个流中做所有的事情,你可以使用下面的代码片段

List<ObjectCountDTO> dtoList = new ArrayList<>();
dtoList.add(new ObjectCountDTO("ALL", countsMap.entrySet().stream()
        .map(e -> {
            dtoList.add(new ObjectCountDTO(e.getKey(), e.getValue()));
            return e;
        })
        .map(e -> e.getValue())
        .reduce(0L, (a, b) -> a + b)));