我有一个GroupItem对象的列表:

public class GroupItem {
    Group group;
    BigDecimal value;
    ...
}

我要实现的是一个映射,其中汇总了相同组键的值。我以以下方式(略微重构的变体,但仍然不够优雅)实现了它:
List<GroupItem> items = generateGroupItemList();

Map<Group, BigDecimal> resultMap = new HashMap<>();
    for (GroupItem item : items) {
        resultMap.put(item.getGroup(), resultMap.getOrDefault(item.getGroup(), BigDecimal.ZERO).add(item.getValue()));
    }

此变体看起来很丑,并且缺乏可读性。我尝试使用流,但未取得任何积极成果。总体思路是围绕Collectors.groupingBy()之类的东西:
items.stream().collect(
        Collectors.groupingBy(
                GroupItem::getGroup,
                Collectors.reducing(GroupItem:getValue, /*BigDecimal::add*/)
));

除了上述变体之外,还有其他更优雅的方法来达到预期效果吗?

最佳答案

使用Stream,您可以使用toMap执行Collectors:

Map<Group, BigDecimal> resultMap = items.stream()
        .collect(Collectors.toMap(GroupItem::getGroup,
                GroupItem::getValue, BigDecimal::add));

10-06 14:42