Collections 分组依据、求和和和返回值
好的,我之前试过问这个问题,结果不太顺利。也许这是我需要的更好的解释 我有一个具有30多个属性的贷款对象。我想根据其中一个属性(贷款编号,一个字符串)进行分组,对另一个属性(贷款金额,一个双精度)求和,然后只返回其余属性。所以我试着:Collections 分组依据、求和和和返回值,collections,java-8,java-stream,Collections,Java 8,Java Stream,好的,我之前试过问这个问题,结果不太顺利。也许这是我需要的更好的解释 我有一个具有30多个属性的贷款对象。我想根据其中一个属性(贷款编号,一个字符串)进行分组,对另一个属性(贷款金额,一个双精度)求和,然后只返回其余属性。所以我试着: Map<String, List<Loan>> groupedLoans = loanList.stream() .collect(groupingBy(Loan::getLoanNum, summingDouble(Loan::g
Map<String, List<Loan>> groupedLoans = loanList.stream()
.collect(groupingBy(Loan::getLoanNum, summingDouble(Loan::getAmount));
Map groupedLoans=loanList.stream()
.collect(分组方式(Loan::getLoanNum,summingDouble)(Loan::getAmount));
但是,这并没有给我贷款列表。我只得到collect语句中使用的两个属性,一个映射
,这不是我想要的(尽管我理解)。我已经丢失了贷款的所有其他属性。我想要一个映射
我从我所做的研究中收集到,我可能需要“新建”另一个贷款对象,并在构造函数中传递属性,但正如我所说的,我有30多个属性,这将很难实现
我怎样才能优雅地实现这一点呢?Take-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());
loans.stream().collect(收集器.groupingBy(Function.identity()),
()->新树映射(Comparator.comparing(Loan::getLoannNumber)),
Collectors.summingDouble(Loan::getValue)))
.entrySet()
.stream()
.map(e->{
归还新贷款(e.getKey(),e.getValue());
})
.collect(Collectors.toList());
e.getKey
实际上是贷款;而e.getValue
是所有分组值的总和。你没有让它变得更容易混淆(至少对我来说)。如果你只是想要一个Map
,那么你所要做的就是:loans.stream().collect(Collectors.groupingBy(Loan::getLoanNum,Collectors.toList())
首先,这会产生一个映射
,这是不正确的,它会产生一个映射
,因为对一个属性求和会产生一个总和,而不是一个总和列表。如果你想要一个映射
,那么,现在的总和在哪里?假设你有两个贷款:LoanA(value=57,loanNum=“123”,name=“one”)
和LoanB(value=57,loanNum=“123”,name=“two”)
。你能展示一下结果会是什么样子吗?你刚才不是说你想按loadNum
对它们进行分组,现在你说按name
?@user1660256除非你用@
标记某人,否则我们不知道你对你自己的问题发表了评论。非常感谢!我想就是这样,但我不确定功能是什么D.身份()是否需要?@user1660256这是一个有效的问题;但是没有任何groupingBy
会忽略该函数;即使在这种情况下,我们实际上不需要它,如果我选择按两个字段而不是一个字段分组,groupBy会有什么不同?@user1660256在我看来,比较器将需要一个,然后第二个f将需要一个你说得太对了!!我想我需要第二种分组方法。