Ответ 1
Вам даже не нужно уменьшать
List<Integer> list = Arrays.asList(1, 2, 3);
int i = list.stream()
.mapToInt(e -> (int) Math.pow(e, list.size()))
.sum();
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() работал правильно?
Вам даже не нужно уменьшать
List<Integer> list = Arrays.asList(1, 2, 3);
int i = list.stream()
.mapToInt(e -> (int) Math.pow(e, list.size()))
.sum();
Решение уже было опубликовано, но вы получаете 756,
потому что первый вызов свести (x, y) с (1,2) равен
1^3+2^3=9
то вы уменьшаете с помощью (x, y) с (9,3)
9^3+3^3=756
BTW, поскольку возведение в степень не является ассоциативным, вы также можете получить другие значения. Например, при использовании параллельного потока я также получил результат 42876
.
Попробуйте это
int i = list.stream()
.map(e -> (int) Math.pow(e, list.size()))
.reduce((x, y) -> x + y)
.get();
Ошибка была найдена, новый код ниже:
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);
Вы также можете использовать collect(Collectors.summingInt(Integer::intValue))
вместо reduce((x, y) -> x + y)
.
ваша логика неправильная, поэтому вы получили 756
int i = list.stream()
.mapToInt(e -> e)
.peek(System.out::println)
.reduce(0,(x, y) -> x + (int) Math.pow(y, list.size()));