2017-01-05 4 views
3

ImはJava 8の動作を読みます。セクション3.5.2で「ボイド互換性のルール」についての段落があります:ラムダ '特別な無効な互換性のルール' - 文の表現

ラムダは、その本体としての文の表現を持っている場合、それはvoidを返す関数記述子と 互換性のある(パラメータ リストを提供互換性もあります)。たとえば、次の行の両方は、消費者の文脈で期待どおりに一覧の方法の追加がブール値ではなく voidを返すにもかかわらず、法的 ある(T - >ボイド):

// Predicate has a boolean return 
Predicate<String> p = s -> list.add(s); 
// Consumer has a void return 
Consumer<String> b = s -> list.add(s); 

どうでしょうあなたは一般的に '文表現'を記述しますか?私はそれが声明か表現かと思った。また、このvoid互換性の規則は私には100%明確ではありません。他の例も考えられますか?

答えて

8

「ステートメント表現」または「表現ステートメント」という用語は、ステートメントとしても使用できる表現を指します。それらはJava言語仕様§14.8. Expression Statementsに記述されています。

彼らは

  • メソッド呼び出し
  • 割り当て
  • インクリメント/デクリメントが
  • クラスインスタンスの作成が

だから、他の例である式式が含ま

Consumer<String> b = s -> counter++; 
Function<String,Integer> f = s -> counter++; 
経験則として

又は

Consumer<String> b = s -> new BigDecimal(s); 
Function<String,BigDecimal> f = s -> new BigDecimal(s); 

、フォームx -> expressionのラムダ式は、Consumer(一般的に又はvoid関数型)に対してのみ有効です、x -> { expression; }も合法的であるかどう。

+0

詳細を教えてください – Deepak

+0

@Deepak:どの部分が分かりませんか? – Holger

関連する問題