Sudhanshu Jaisani:
なぜしないforEach
関数の型引数は、消費者の代わりに渡されたとき、Javaのメソッドは、コンパイラエラーが表示されませんか?ここでは両方のラインのは、ストリーム内のすべての要素のためのブール値を返しているだけで2行目は、コンパイルエラーを取得しましたか?他のプロパティがありラムダ式このようなシナリオのためには?
ここに私のコードは次のとおりです。
Stream.of(1,2,3,4).forEach(a->a.equals(1));//line 1
Stream.of(1,2,3,4).forEach(a->{return a.equals(1);});//line 2
ernest_k:
理由について、最初の行の作品を:で説明があります仕様は:
一般的に言えば、フォームのラムダ
() -> expr
、expr
ステートメント式があるが、いずれかとして解釈され() -> { return expr; }
、または() -> { expr; }
ターゲット・タイプに応じて、。
上記の例以下が付属しています(良い偶然、これはあなたの例と非常によく似ています):
// Consumer has a void result
java.util.function.Consumer<String> c = s -> list.add(s);
これは単にあなたのコードがであるかのように、コンパイラは、表現の戻り値の型を無視することを意味し、単にこの(空メソッドに対して有効です):
Stream.of(1, 2, 3, 4).forEach(a -> {
a.equals(1);
});
2行目については、スペックは言います:
ブロック内のすべてのreturn文の形式を持っている場合、ブロックラムダ本体は、ボイドの互換性があります
return;
。
あなたのケースでは、しかし、{return a.equals(1);}
この規則を満たしていません。空のメソッドは値を返しません。
これを理解する簡単な方法は、コンパイラは(体が宣言と互換性がなければならないような方法で本体の検証ルールを適用することを検討することであるpublic void accept(T t)
) -で述べたように、チュートリアル