#java #intellij-idea #lambda #java-8 #method-reference
#java #intellij-идея #лямбда #java-8 #метод-ссылка
Вопрос:
У меня есть статический метод, который принимает параметр Stream<Double> stream
. Исходящее либо из arraylist.stream()
, либо Arrays.stream(array)
.
Задача метода — вернуть сумму всех целых чисел, которые делятся на три.
return stream.filter(i -> i.intValue() % 3 == 0).mapToInt(i -> i.intValue()).sum()
Этот метод работает, однако IntelliJ предлагает следующее:
Эта проверка сообщает о лямбда-выражениях, которые могут быть заменены ссылками на методы.
Я не слишком хорошо знаком со ссылками на методы, особенно со ссылками на методы экземпляра, использующие сценарий имен классов.
Я попробовал следующее, которое выдает ошибку.
stream.filter(i -> i.intValue() % 3 == 0).mapToInt(Integer::intValue).sum()
Есть предложения?
Комментарии:
1. Поскольку
i
является двойным, вы должны использоватьDouble::intValue
. IntelliJ не только проверяет, но и предлагает изменения. Просто нажмите alt-enter.2. Если IntelliJ предлагает такую замену, вы можете направить его на эту замену. Кстати, было бы эффективнее распаковывать только один раз, т.е.
.mapToInt(Double::intValue).filter(i -> i % 3 == 0)
3. @Holger не приводит ли изменение порядка к возможности округления удвоений до целых чисел, которые затем делятся на три и изменяют результат?
4. Ваш исходный код,
i.intValue() % 3 == 0
, уже делает именно это.
Ответ №1:
Как вы сказали, поток параметров имеет тип Double, поэтому вам следует сделать
stream.mapToInt(Double::intValue).filter(i -> i % 3 == 0).sum()
потому что вы вызываете функцию intValue двойного класса.