Ответ 1
ОператорA throw
- это утверждение, а не выражение, поэтому оно должно быть помещено в фигурные скобки. Согласно в этой статье, группа экспертов Java провела неофициальное исследование синтаксиса лямбда в то время, и было четыре варианта:
- Strawman:
#(arglist)(expr) and #(arglist){statements}
- BGGA:
{ args -> statements }
(аналогично Scala и Groovy) - SotL:
#{ args -> statements}
- Редмонд:
(args) -> { statements }
В конечном счете, выбор заключался в том, чтобы использовать синтаксис, аналогичный синтаксису С# в соответствии с этот поток, который также близок к последнему варианту выше насколько я вижу. В С# существует различие между выражением lambdas и statement lambdas:
Выражение lambda (С#):
(input parameters) => expression
Заявление lambda (С#):
(input parameters) => {statement;}
Синтаксис объясняется в этой странице документации MSDN.
И обоснование выбора этого синтаксиса над другими параметрами упоминается в предыдущем потоке:
Решение о выборе этого синтаксиса было двояким:
Синтаксис оценивается "очень хорошо" по большинству субъективных мер (хотя имеет случаи, когда это выглядит плохо, как и все остальные). В в частности, он хорошо справляется с "малыми" лямбдами, которые используются как метод аргументы (общий случай), а также хорошо с большими (многозадачность) лямбда.
Несмотря на обширный поиск, среди победителей альтернативы (каждая форма имела некоторые хорошие аспекты, а некоторые действительно не очень хорошие аспекты, и не было формы, которая была бы явно лучше, чем другие). Итак, мы чувствовали, что лучше выбрать то, что имеет как было показано, хорошо работает на двух языках, которые больше всего напоминают Java - С# и Scala - вместо того, чтобы придумывать что-то новое.