Java8 сокращая поток

1

У меня есть следующие методы:

static IntStream streamedDivisors(final int n) {
    return IntStream.range(2, n).parallel().filter(input -> n % input == 0);
}

static int streamedPhi(final int n) {
    return streamedDivisors(n).reduce(0, x -> x * x);
}

и я получаю ошибку компиляции в streamedPhi, указывающую, что у меня есть несовместимые типы параметров в моем выражении лямбда. Может ли кто-нибудь помочь мне понять это? Я по существу стараюсь взять делители заданного числа n и агрегировать число по некоторой определенной мне функции (в этом случае, возведя квадрат числа).

  • 0
    Если вам нужна сумма квадратов, это отображение и уменьшение (накопление). Вы указали функцию отображения, но не в том месте. И вы вообще не указали свою функцию накопления! Вы, вероятно, хотите: streamedDivisors (n) .map (x -> x * x) .sum () или какое-то другое сокращение, кроме sum.
  • 0
    Да, я понял это позже. И быть исправленным вами - это и честь, и смущение :) Серьезно, я большой поклонник @BrianGoetz! Ваша книга обязательна к чтению в рабочий день
Теги:
java-8
lambda
java-stream

1 ответ

5
Лучший ответ

Ваша проблема компиляции связана с тем, что IntBinaryOperator#applyAsInt(int, int) принимает два аргумента. Вы только объявляли/предоставляли его.

Как указано в комментариях и после просмотра javadoc IntStream#reduce(int, IntBinaryOperator), вы фактически не применяете действительное сокращение. Мне не сразу понятно, что вы имеете в виду и суммируете число по определенной функции, которую я определил, но у Брайана есть некоторые предложения.

  • 0
    Это странно. Почему это требует двух аргументов? Разве var args не будет более подходящим?
  • 0
    @AmirAfghani Это бинарный оператор. 2.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню