小编dxh*_*707的帖子

在Java流中添加多个字段(以及条件流操作)

假设我有这个课程:

public class Thing {
    private BigDecimal field1;
    private BigDecimal field2;

    private BigDecimal otherField1;
    private BigDecimal otherField2;
    private BigDecimal otherField3;
}
Run Code Online (Sandbox Code Playgroud)

并且在另一个类I for--over a List<Thing> things,将field1和field2添加到迭代完成时返回的总和.

但我想要的是用Java流来实现这一目标.以下是我所拥有的 - 它的工作原理,但我觉得必须有一种方法可以将其浓缩为一个流:

public BigDecimal addFields(List<Thing> things) {
    BigDecimal field1sum = things.parallelStream()
                                     .filter(thing -> thing.getField1() != null)
                                     .map(Thing::getField1)
                                     .reduce(BigDecimal.ZERO, BigDecimal::add);

     BigDecimal field2sum = things.parallelStream()
                                     .filter(thing -> thing.getField2() != null)
                                     .map(Thing::getField2)
                                     .reduce(BigDecimal.ZERO, BigDecimal::add);
     return field1sum.add(field2sum);
}
Run Code Online (Sandbox Code Playgroud)

我怀疑答案是reduce()采用三个参数的方法,其中一个是BiFunction,但我无法弄清楚如何使其工作.编辑:我想我会在传递(x,y) -> x.add(y)reduce(),但接下来的问题是如何做我map()这两个领域?

另外,是否有可能/如何将此命令式代码转换为功能流?

public BigDecimal addOtherFields(List<Thing> things) {
    BigDecimal …
Run Code Online (Sandbox Code Playgroud)

java lambda functional-programming java-8 java-stream

5
推荐指数
2
解决办法
2761
查看次数