Ответ 1
В соответствии с JLS раздел 15.27:
Это ошибка времени компиляции, если выражение lambda возникает в программе в некотором месте, отличном от контекста назначения (§5.2), контекста вызова (§5.3) или контекста каста (§5.5).
Также возможно использовать лямбда-выражение в выражении return
.
Затем мы можем переписать ваш пример четырьмя различными способами:
-
Создав контекст назначения:
Function<Boolean, Boolean> function = p -> p; boolean x = function.apply(true);
-
Создавая контекст вызова:
foobar(p -> p); private static void foobar(Function<Boolean, Boolean> function) { boolean x = function.apply(true); }
-
Создав контекст кастинга:
boolean x = ((Function<Boolean, Boolean>) p -> p).apply(true);
-
Используя оператор
return
:boolean x = function().apply(true); private static Function<Boolean, Boolean> function() { return p -> p; }
Кроме того, в этом простом примере полное лямбда-выражение может быть переписано как:
UnaryOperator<Boolean> function = UnaryOperator.identity();