関数型の引数が消費者の代わりに渡されたときに、なぜのために、各Javaのメソッドは例外をスローしないしないのですか?

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:

理由について、最初の行の作品を:で説明があります仕様は

一般的に言えば、フォームのラムダ() -> exprexprステートメント式があるが、いずれかとして解釈され() -> { 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)) -で述べたように、チュートリアル

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=201983&siteId=1