List通过stream分组后再转Map后无序解决方案Collectors.toMap()报错

List分组后再使用stream进行汇总并转成Map

taCustPrdCapitalsList.stream().filter(a -> null != a).collect(Collectors.groupingBy(TaCustPrdCapital::getConfirmDate)).entrySet().stream()
                .map(entry ->
                        new AbstractMap.SimpleEntry<String, BigDecimal>(
                                entry.getKey(),
                                entry.getValue().stream().map(TaCustPrdCapital::getConfirmBalance).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)
                        ))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)

 Collectors.toMap(map的key, map的Value)

通过这种toMap转成Map可能会出现key值重复而导致报错的问题

Collectors.toMap的三个参数

(i1, i2) -> i1  当key值重复时,使用第一个Value的值

(i1, i2) -> i2  当key值重复时,使用最后一个Value的值

Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (i1, i2) -> i2)

 Collectors.toMap(map的keymap的Value重复Key值时取值)

上面代码会返回一个无序Map

如果需要一个有序Map时就需要在toMap里面增加TreeMap::new返回一个有序Map

Collectors.toMap的四个参数

Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (i1, i2) -> i2, TreeMap::new)

 Collectors.toMap(map的keymap的Value重复Key值时取值, map类型)

taCustPrdCapitalsList.stream().filter(a -> null != a).collect(Collectors.groupingBy(TaCustPrdCapital::getConfirmDate)).entrySet().stream()
                .map(entry ->
                        new AbstractMap.SimpleEntry<String, BigDecimal>(
                                entry.getKey(),
                                entry.getValue().stream().map(TaCustPrdCapital::getConfirmBalance).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)
                        ))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (i1, i2) -> i2, TreeMap::new));

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值