Java:如果存在键,则构造一个聚合其值的映射
Java: construct a map aggregating its value if key is present
我有一个 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*/)
));
除了上面的变体之外,还有更优雅的方法来达到预期的效果吗?
您可以使用merge方法:
List<GroupItem> items = generateGroupItemList();
Map<Group, BigDecimal> resultMap = new HashMap<>();
for (GroupItem item : items) {
resultMap.merge(item.getGroup(), item.getValue(), BigDecimal::add);
}
使用Stream
,你可以用Collectors
执行toMap
:
Map<Group, BigDecimal> resultMap = items.stream()
.collect(Collectors.toMap(GroupItem::getGroup,
GroupItem::getValue, BigDecimal::add));
我有一个 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*/)
));
除了上面的变体之外,还有更优雅的方法来达到预期的效果吗?
您可以使用merge方法:
List<GroupItem> items = generateGroupItemList();
Map<Group, BigDecimal> resultMap = new HashMap<>();
for (GroupItem item : items) {
resultMap.merge(item.getGroup(), item.getValue(), BigDecimal::add);
}
使用Stream
,你可以用Collectors
执行toMap
:
Map<Group, BigDecimal> resultMap = items.stream()
.collect(Collectors.toMap(GroupItem::getGroup,
GroupItem::getValue, BigDecimal::add));