Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Вы не можете заменить 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)
возвращается.
Обратите внимание, что правило гласит: «Замените лямбда с помощью ссылок на методы , когда это возможно », что дает вам возможность сказать: «ну, здесь невозможно », Однако, я не уверен, как много вы можете назвать это« правилом »тогда ...