GroupingBy,求和,返回值

时间:2017-03-13 17:13:59

标签: collections java-8 java-stream

好的,我之前尝试过问这个问题并且进展不顺利。也许这是对我需要的更好的解释。

我有一个包含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个属性,那将是笨重。

我怎样才能优雅地实现这一目标?

1 个答案:

答案 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是所有分组值的总和。