好的,我之前尝试过问这个问题并且进展不顺利。也许这是对我需要的更好的解释。
我有一个包含30多个属性的Loan对象。我想按其中一个属性(贷款号,一个字符串),另一个属性(贷款金额,一个Double)进行分组,然后返回剩余的属性。所以我试过了:
Map<String, List<Loan>> groupedLoans = loanList.stream()
.collect(groupingBy(Loan::getLoanNum, summingDouble(Loan::getAmount));
然而,这并没有给我一份贷款清单。我只获得了collect语句中使用的2个属性Map<String, List<Double>>
,这不是我想要的(虽然我理解)。我已经失去了贷款的所有其他属性。我想要Map<String, List<Loan>>
。
我从已经完成的研究中收集到了我可能需要'新'另一个Loan对象,并在构造函数中传递属性,但就像我说的,我有超过30个属性,那将是笨重。
我怎样才能优雅地实现这一目标?
答案 0 :(得分:2)
取-2。让我们看看这次是否可以解决它。显然你首先需要一个这样的复制构造函数:
public Loan(Loan other, double value) {
this.someProp = other.someProp;
.....
this.value = value;
}
那么您仍然需要使用比较器收集到地图,并考虑loanNum
:
loans.stream().collect(Collectors.groupingBy(Function.identity(),
() -> new TreeMap<>(Comparator.comparing(Loan::getLoanNumber)),
Collectors.summingDouble(Loan::getValue)))
.entrySet()
.stream()
.map(e -> {
return new Loan(e.getKey(), e.getValue());
})
.collect(Collectors.toList());
e.getKey
实际上是贷款;而e.getValue
是所有分组值的总和。