Вызов методов объекта в Arrays.reduce (...) - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть следующие 3 файла,

A.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.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Как уже упоминалось в моем комментарии выше, публикуем другую альтернативу, где вам не нужна вторая версия метода Reduce.

public float totalB() {
    return Arrays.stream(d).map(i -> i.getB()).reduce(Float::sum).get();
}
0 голосов
/ 15 ноября 2018

Я предпочитаю использовать метод "сумма", так как он более читабелен, чем общий шаблон reduce. т.е.

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

Это более идиоматичный, читаемый и эффективный подход, чем ваш Arrays.stream(d).reduce(...) ...

.
0 голосов
/ 15 ноября 2018

Вариант с одним аргументом 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...