java8中Collectors.groupingBy下用Collectors.reducing的疑惑

2025-05-08 01:37:11
推荐回答(4个)
回答1:

改成下面这样就可以了。
List list = new ArrayList();
GrossMarginPredictedDetailDto a = new GrossMarginPredictedDetailDto();
GrossMarginPredictedDetailDto a1 = new GrossMarginPredictedDetailDto();
GrossMarginPredictedDetailDto a2 = new GrossMarginPredictedDetailDto();
GrossMarginPredictedDetailDto a3 = new GrossMarginPredictedDetailDto();
a.setMatnr("abc");
a1.setMatnr("edf");
a2.setMatnr("abc");
a3.setMatnr("dd");
a.setN_clie1(new BigDecimal("1.5"));
a1.setN_clie1(new BigDecimal("1.5"));
a2.setN_clie1(new BigDecimal("1.4"));
a3.setN_clie1(new BigDecimal("1.0"));
list.add(a);
list.add(a1);
list.add(a2);
list.add(a3);
Map map1 = list.stream().collect(Collectors.groupingBy(GrossMarginPredictedDetailDto::getMatnr, Collectors.reducing(new GrossMarginPredictedDetailDto(), (v1, v2) -> {
GrossMarginPredictedDetailDto dto = new GrossMarginPredictedDetailDto();
dto.setMatnr(v1 != null ? v1.getMatnr() : v2.getMatnr());
dto.setN_clie1(Optional.ofNullable(v1).map(GrossMarginPredictedDetailDto::getN_clie1).orElse(BigDecimal.ZERO).add(Optional.ofNullable(v2).map(GrossMarginPredictedDetailDto::getN_clie1).orElse(BigDecimal.ZERO)));
return dto;
})));

回答2:

可以用Java8的Stream来帮助生成集合,举例如下: public static void main(String[] args) { // 起始数字 int start = 1; // 生成数字的个数 int end = 100; // 生成1,2,3,4,5100 List list = Stream.iterate(start, item -> item+1).limit(e

回答3:

reducing里面return一个新对象出来,不要return X1。

回答4:

我也遇到同样的问题了,有大神知道什么原因吗?