Collections 分组依据、求和和和返回值

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

好的,我之前试过问这个问题,结果不太顺利。也许这是我需要的更好的解释

我有一个具有30多个属性的贷款对象。我想根据其中一个属性(贷款编号,一个字符串)进行分组,对另一个属性(贷款金额,一个双精度)求和,然后只返回其余属性。所以我试着:

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将需要一个
你说得太对了!!我想我需要第二种分组方法。