2016-12-10 1 views
-2

現在、Java 8のスキルを向上させようとしています。しかし、今私は理解していない次の問題に直面しています。"有効な"(?)ラムダ式の "voidメソッドは値を返すことができません"

はのは、次のコードの平和を想定してみましょう:

List<String> words = generateNewList(); 
words.stream().filter(w -> w.length() < 4).forEach(print()); 

今、私はfilter方法で使用する代わりに、実際のメソッド呼び出しでラムダ式を書くことができる方法の参考としてラムダを作成したいです。私のアプローチは:

Consumer<String> shortFilter = w -> w.length() < 4; 
words.stream().filter(shortFilter).forEach(print()); 

問題があり、Eclipseは私に言うw -> w.length() < 4のエラーを示しています。

は それはちょうど私のために多くの混乱になっ

は、以下の変更削除しを引き起こす「ボイドメソッドが値を返すことはできませんが」エラー:

Consumer<String> shortFilter = w -> shorterThen4(w); 
    ... 
} 

public boolean shorterThen4(String w) { 
    return w.length() < 4; 
} 

ありがとう、ヒントまたは発言してください。

+0

*私のJavaラムダ構文-fuは弱いですが、確かに '.forEach(print());'は*呼び出して 'print()'を呼び出し、その戻り値を'forEach'? –

+2

filter()メソッドは、Consumerではなく、Predicateを要求します。述語はブール値を返します。消費者は無効を返す。 –

+0

[Consumer'のJavaDoc](http://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html):* "単一の入力を受け入れる操作を表します引数**と結果を返しません。** "*(私の強調)。 –

答えて

0

あなたが必要とするのは、JB Nizetがコメントしたように、述語にはラムダ式を代入することです。プレディケートはブール値を返し、コンシューマはvoidを返します。

Predicate<String> isLessThan4 = w -> w.length() < 4; 
List<String> words = generateNewList(); 
words.stream().filter(isLessThan4).forEach(print()); 

あなたは機能インタフェースの両方を使用する方法をもう少し理解してPredicateConsumerのためのJavaドキュメントを見たいかもしれません。

こちらがお役に立てば幸いです。

+0

ありがとう!助けてください;) – lavandyke

関連する問題