Замена лямбда-выражения ссылкой на метод

#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 двойного класса.