Когда фигурные скобки необязательны в синтаксисе lambda Java 8?

Я понимаю, что реализация lambda Java 8 может быть изменена, но в lambda build b39 я обнаружил, что фигурные скобки могут быть опущены только тогда, когда выражение lambda возвращает непустой тип. Например, это компилирует:

public class Collections8 { public static void main(String[] args) { Iterable names = Arrays.asList("Alice", "Bob", "Charlie"); names.filter(e -> e.length() > 4).forEach(e -> { System.out.println(e); }); } } 

Но снимая фигурные скобки следующим образом:

 names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e)); 

дает ошибку

 Collections8.java:6: error: method forEach in interface Iterable cannot be applied to given types; names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e)); ^ required: Block found: lambda reason: incompatible return type void in lambda expression where T is a type-variable: T extends Object declared in interface Iterable 

Может ли кто-нибудь объяснить, что здесь происходит?

Вы можете опустить фигурные скобки, когда тело lambda является единственным выражением или вызовом метода void. Каждое выражение оценивает значение и, следовательно, не может быть недействительным.

Если тело lambda представляет собой блок утверждений (например, ряд вычислений, за которым следует оператор return ), или lambda не имеет значения (т. Е. Имеет тип возврата void ) и не является единственным вызовом метода void, вы должны использовать блочную форму, которая требует скобок.

В блочной lambda, если значение return ed, тогда все возможные пути кода должны либо return значение, либо throw Throwable .

Это только в: EG (в основном) принял решение о синтаксисе.

Рассмотрев ряд альтернатив, мы решили по существу принять синтаксис C #. Мы все еще можем дополнительно рассказать о точках (например, тонкая стрелка против стрелки жира, специальная ничтожная форма и т. Д.) И еще не пришли к решению о синтаксисе ссылок на метод.

Синтаксис C #:

 lambda = ArgList Arrow Body ArgList = Identifier | "(" Identifier [ "," Identifier ]* ")" | "(" Type Identifier [ "," Type Identifier ]* ")" Body = Expression | "{" [ Statement ";" ]+ "}" 

Выражение что-то оценивает, вы не можете иметь недействительные выражения в Java. Это утверждение, поэтому вам нужно {} вокруг него.

http://mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html

Я пробовал свой код и для самой современной версии JRE, я думаю, все будет в порядке.

Ниже я ссылаюсь на документы Oracle Java.

В выражении lambda вы должны заключать выражения в фигурные скобки ( {} ). Однако вам не нужно вставлять вызов void-метода в фигурные скобки.
Например, следующее действительное выражение lambda:

 email -> System.out.println(email) 

И док объясняет довольно ясно. Надеюсь, это может решить вашу проблему.

Ссылки: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

Если фигурных скобок нет, lambda автоматически возвращает одно выражение после оператора ->.
Таким образом, когда у вас есть lambda, которая ничего не возвращает, вы должны использовать фигурные скобки

  • Linq-запрос или выражение Lambda?
  • Почему вы используете Expression <Func >, а не Func ?
  • Зачем использовать std :: bind over lambdas в C ++ 14?
  • Поток Zipping с использованием JDK8 с lambda (java.util.stream.Streams.zip)
  • Невозможно использовать параметр ref или out в lambda-выражениях
  • Использование адаптеров Boost с C ++ 11 lambdas
  • Можно ли определить тип параметра и тип возврата lambda?
  • Lambda для выражений типа в Haskell?
  • Как назначить Func условно между lambdaми, используя условный тернарный оператор?
  • В чем разница между привязкой лямбды и метода на уровне выполнения?
  • преобразование .net Func в .net Expression <Func >
  • Interesting Posts

    Как преобразовать List в строку с разделителями-запятыми без повторения списка явно

    Как отказаться от подписки на широковещательное событие в angularJS. Как удалить функцию, зарегистрированную через $ on

    Как использовать pip с Python 3.x вместе с Python 2.x

    / show включить эквивалентную опцию в g ++

    GooglePlayServicesUtil против GoogleApiAvailability

    ValidateAntiForgeryToken цель, пояснение и пример

    Файл Makefile с несколькими исполняемыми файлами

    Как удалить несколько строк без цикла в Excel VBA

    Неконстантная ссылка связана с временной ошибкой Visual Studio?

    предупреждение: несовместимое неявное объявление встроенной функции «xyz»

    Как преобразовать escape-строку JSON в объект JSON?

    Как выбрать, что отображается в строке заголовка PuTTY из Linux?

    Почему Java BufferedReader () не читает арабский и китайский символы правильно?

    Добавление заголовка в GridView (Android)

    Как мне обращаться с мьютексами в подвижных типах на C ++?

    Давайте будем гением компьютера.