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的key, map的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的key, map的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));