Использование Java Stream.reduce() для вычисления суммы полномочий дает неожиданный результат

List<Integer> list = Arrays.asList(1, 2, 3);

int i = list.stream().mapToInt(e -> e)
            .reduce((x, y) -> (int) Math.pow(x, list.size()) + (int) Math.pow(y, list.size()))
            .getAsInt();
        System.out.println(i);

Результат этой операции должен быть 1 * 1 * 1 + 2 * 2 * 2 + 3 * 3 * 3 = 36. Но вместо этого я получаю я = 756. Что не так? Что я должен изменить для того, чтобы reduce() работал правильно?

Ответ 1

Вам даже не нужно уменьшать

List<Integer> list = Arrays.asList(1, 2, 3);

int i = list.stream()
         .mapToInt(e -> (int) Math.pow(e, list.size()))
         .sum();

Ответ 2

Решение уже было опубликовано, но вы получаете 756,

потому что первый вызов свести (x, y) с (1,2) равен

1^3+2^3=9

то вы уменьшаете с помощью (x, y) с (9,3)

9^3+3^3=756

BTW, поскольку возведение в степень не является ассоциативным, вы также можете получить другие значения. Например, при использовании параллельного потока я также получил результат 42876.

Ответ 3

Попробуйте это

int i = list.stream()
            .map(e -> (int) Math.pow(e, list.size()))
            .reduce((x, y) -> x + y)
            .get();

Ответ 4

Ошибка была найдена, новый код ниже:

List<Integer> list = Arrays.asList(1, 2, 3);

int i = list.stream().mapToInt(e -> e)
             .map(e -> (int) Math.pow(e, list.size()))
             .reduce((x, y) -> x + y)
             .getAsInt();
System.out.println(i);

Ответ 5

Вы также можете использовать collect(Collectors.summingInt(Integer::intValue)) вместо reduce((x, y) -> x + y).

Ответ 6

ваша логика неправильная, поэтому вы получили 756

int i = list.stream()
            .mapToInt(e -> e)
            .peek(System.out::println)
            .reduce(0,(x, y) -> x + (int) Math.pow(y, list.size()));