2017-01-31 8 views
5

私は、Javaのラムダはチェック例外をスローすることはできませんが、RuntimeExceptionをスローすることができることを理解していますが、なぜ下のコードは角かっこを必要としますか?ランタイム例外をスローするJavaラムダに角括弧が必要なのはなぜですか?

Map<String, Integer> m = new HashMap<>(); 
Integer integer = m.computeIfAbsent("", s -> {throw new IllegalArgumentException("fail");}); 

なぜあなたは持っていないのですか?

m.computeIfAbsent("", s -> throw new IllegalArgumentException("fail")); 

それが原因、それはこの例ではint型を返すコンパイラの前提にされているので、そのためには、そのが投げていても、例外のリターンを持つことができませんか?

+4

基本的に、 's-> expr'形式は式のためだけに機能します。 'throw'はステートメントです。 – ZhongYu

+0

ああ、これは意味がある、あなたがそれを答えに入れるなら、私はマークされた答えとしてそれを入れます – Ash

+2

また[this](http://stackoverflow.com/q/41482574/2711488)と[that] http://stackoverflow.com/q/24146285/2711488)... – Holger

答えて

6

Java言語仕様describes the body of a lambda expression

ラムダ体は、単一の発現またはブロック(§14.2)のいずれかです。

これは、しかし、

throw new IllegalArgumentException("fail") 

throwstatement、ない表現です。したがって、コンパイラはラムダ式の本体としてそれを拒否します。

ウサギの穴を下にして、表現の種類がすべてhere(文法に従う)であることを知ることができます。

+0

+1。迷った 'throw '文をラムダに入れたとき、' javac'は 'throw'で' '不正な式の開始'を返します。 –

関連する問題