Лямбда при использовании шаблона построителя [дубликат]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

11
задан gontard 1 September 2014 в 14:35
поделиться

1 ответ

Вы не можете заменить lambda input -> getValueProvider().apply(input).getValue() ссылкой на метод без изменения семантики.

Ссылка на метод заменяет вызов метода single , поэтому он не может просто замените лямбда-выражение, состоящее из более чем одного вызова метода.

Лямбда-выражение формы input -> getValueProvider().apply(input) может быть заменено на getValueProvider()::apply, если и только если время оценки getValueProvider() не имеет значения, как в лямбдной форме, метод вызывается для каждой оценки лямбда-тела, а для ссылки на метод он вызывается только один раз и результат захватывается.

Это похоже на разницу между x -> System.out.println(x) и System.out::println, где чтение содержимого поля System.out происходит в разное время, но обычно это не имеет значения. Но вы должны знать разницу.

В вашем примере вызывается третий метод getValue(). Единственный способ выразить это с помощью ссылок на методы требует функционального интерфейса, такого как Function, который имеет такие методы, как andThen и / или compose. Тем не менее, как работает Java 8, для чего требуется, чтобы первая ссылка метода на целевой интерфейс вызывала метод комбинирования, который отнюдь не будет легче читать, что у вас есть лямбда-выражение: ((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue), где Y тип apply(input) возвращается.

Обратите внимание, что правило гласит: «Замените лямбда с помощью ссылок на методы , когда это возможно », что дает вам возможность сказать: «ну, здесь невозможно », Однако, я не уверен, как много вы можете назвать это« правилом »тогда ...

20
ответ дан Holger 19 August 2018 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: