2017-10-29 6 views
-1

以下の例では、someObjectsが1つのセットです。ループ内で条件が一致した場合にtrueを返そうとしていますが、これはコンパイルされていないようです。しかし、私はちょうど "リターン"を追加するとき、それは正常に動作します。私は修正する必要がある問題は何ですか?タイプJava 8 forEachループから値を返します

public boolean find(){ 

    someObjects.forEach(obj -> { 
     if (some_condition_met) { 
      return true; 
     } 
    }); 

    return false; 
} 

コンパイルエラー

方法forEachの(消費者) のIterableが引数に適用されない(( OBJ) - > {})

+0

あなたはそれを動作させるために「復帰」を追加します:私はobjのタイプはObjectであると仮定しましたか? – AntonH

+1

コンパイラエラーとは何ですか?出力を質問に追加します。 – francium

+1

ラムダの体内の外側のメソッドから戻ることは不可能です。代わりにforループを使用してください –

答えて

5

CollectionforEach方法は「の値をとる関数を意味しているConsumerを期待していますが、doesnのあなたのような何かをする必要があり何も返さない。そのため、return true;は使用できませんが、return;は問題ありません。

条件が満たされたときにループから抜け出したい場合は、単純なfor(...)ループを使用する方がよいでしょう。

for (Object obj : someObjects) { 
    if (some_condition_met) { 
    return true; 
    } 
} 

return false; 
+0

ありがとうございます、返品が無効の場合、返品はどのようになりますか?戻り値はループを終了するだけですか? –

+0

いいえあなたの例では、 'return;'はラムダを抜けてコレクションの次の要素に進むだけです。ループは終了しません。 – pablochan

+0

ありがとうございます!だから私はそれが同じであると思います。 –

2

forEach受け付けConsumerしたがって、voidを返さない動作を渡すことはできません。私はあなたがこれをしたいと思います

return someObjects.stream().anyMatch(e -> condition); 
7

public boolean find(){ 
    return someObjects.stream().anyMatch(o -> your_condition); 
} 
+0

おそらくそうではありません。ストリームを構築する際のオーバーヘッドがあります。それは昔ながらの(Java 8以前の)方法よりもずっと優れています。 –

+3

@DawoodibnKareem私はOPが機能的なスタイルで何かを望んでいると思う。彼の得点から判断すると、彼は昔ながらのやり方でそれをする方法を知るべきです。 – HuStmpHrrr

+1

おそらく、これは明らかに「機能スタイル」が間違った解決策であるケースです。 –

関連する問題