减少 java 中自定义对象的操作

2022-09-02 23:32:42

如何使用 Reduce 操作对对象的两个字段执行求和。

例如:

class Pojo
{
    public Pojo(int a, int b) {
        super();
        this.a = a;
        this.b = b;
    }
    int a ;
    int b;
    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }

}

Pojo object1 = new Pojo(1, 1);
Pojo object2 = new Pojo(2, 2);
Pojo object3 = new Pojo(3, 3);
Pojo object4 = new Pojo(4, 4);

List<Pojo> pojoList = new ArrayList<>();

pojoList.add(object1);
pojoList.add(object2);
pojoList.add(object3);
pojoList.add(object4);

我可以像这样执行求和:IntStream

int sum = pojoList.stream()
                  .mapToInt(ob -> (ob.getA() + ob.getB()))
                  .sum();

我想使用reduce执行相同的操作,但不知何故,我没有得到正确的语法:

pojoList.stream()
        .reduce(0, (myObject1, myObject2) -> (myObject1.getA() + myObject2.getB()));

答案 1

好吧,如果你想调用减少:IntStream

int sum = pojoList.stream()
                  .mapToInt(ob ->(ob.getA()+ob.getB()))
                  .reduce(0, (a,b)->a+b);

当然,同样适用于:Stream<Integer>

int sum = pojoList.stream()
                  .map(ob ->(ob.getA()+ob.getB()))
                  .reduce(0, (a,b)->a+b);

或使用方法引用:

int sum = pojoList.stream()
                  .map(ob ->(ob.getA()+ob.getB()))
                  .reduce(0, Integer::sum);

或不带 :map()

int sum = pojoList.stream()
                  .reduce(0, (s,ob)->s+ob.getA()+ob.getB(),Integer::sum);

在最后一个示例中,我使用变体:

<U> U reduce(U identity,
             BiFunction<U, ? super T, U> accumulator,
             BinaryOperator<U> combiner);

因为简化值 (a) 与元素的类型不同。IntegerStream

第一个参数是标识值 - 0。

第二个参数将当前元素的 和 值添加到中间和中。getA()getB()Pojo

第三个参数组合了两个部分和。


答案 2

sum()方法实现如下:

public final int sum() {
    return reduce(0, Integer::sum);
}

替换为 :sum()reduce()

int sum = pojoList.stream()
                  .mapToInt(ob -> (ob.getA() + ob.getB()))
                  .reduce(0, Integer::sum);

或者,不带 :mapToInt()

int pojoSum = pojoList.stream()
                      .reduce(0, (sum, ob) -> sum + ob.getA() + ob.getB(), Integer::sum);

有关详细信息,请参阅缩减操作段落。


推荐