在 Arrays.reduce(...) 中调用对象方法

2022-09-03 12:41:02

我有以下3个文件,

答.java:

class A {

    private float b;    

    public A(float b) {
        this.b = b;
    }

    public float getB() {
        return b;
    }

}

C.java:

import java.util.Arrays;

class C {

    private A[] d;
    private int i = 0;

    public C() {
        d = new A[2];
    }

    public float totalB() {
        return Arrays.stream(d).reduce((e, f) -> e.getB() + f.getB()).get();
    }

    public void addB(A b) {
        d[i++] = b;
    }

}

D.java:

class D {

    public static void main(String[] args) {
        C c = new C();
        c.addB(new A(3));
        c.addB(new A(5));
        System.out.println(c.totalB())
    }

}

我期望D.java中的最后一行输出8,但是我得到这个错误:

error: incompatible types: bad return type in lambda expression return Arrays.stream(d).reduce((e, f) -> e.getB() + f.getB()).get(); ^ float cannot be converted to A 为什么会发生这种情况?我看不到将浮点数转换为对象 A 的位置。


答案 1

我更喜欢使用“sum”方法,因为它比一般模式更具可读性。即reduce

return (float)Arrays.stream(d)
                    .mapToDouble(A::getB)
                    .sum();

这是更惯用,可读性和更有效的方法,而不是您的方法...Arrays.stream(d).reduce(...)


答案 2

单个参数变体期望 reduce 运算的最终结果与元素的类型相同。reduce()Stream

您需要一个不同的变体

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

您可以按如下方式使用:

public float totalB() {
    return Arrays.stream(d).reduce(0.0f,(r, f) -> r + f.getB(), Float::sum);
}