2016-06-22 7 views
1

Iを順に実行する必要がある3つのチェックに基づいて第1の結果を選択する必要があります。すなわち基準1を満たしているオブジェクトがない場合、我々はその上の任意のオブジェクトの会議の基準2を探します。ここに私の作業コードはこのコードを改善できますか?

私たちはこのコードを改善できますか?すべての基準を評価するための最初のストリームを再利用する方法があるかどうかはわかりません。

+2

ようこそスタックオーバーフローに!代わりにhttp://codereview.stackexchange.com/に投稿することを検討してください。 (オプションのタグはプログラミングにおけるオプションの概念を指します) –

+1

@PWhite findFirst()は 'Optional'を返し、' orElseGet'はOptionalクラスのメソッドです。従ってOPはタグ 'optional'を含めるのは正しいものでした。 –

+1

'() - > {return expression;}を書く必要はありません。 } '、単純な'() - >式 'で十分です。それはまた、ネストされたラムダに適用されます... – Holger

答えて

6

私はロジックから基準のリストを区切りになります。

List<Predicate<MyClass>> criteria = Arrays.asList(
    MyCass::meetsCriterion1, 
    MyCass::meetsCriterion2, 
    MyCass::meetsCriterion3 
); 


MyClass result = criteria.stream() 
    .flatMap(c -> myObjects.stream().filter(c).limit(1)) 
    .findFirst() 
    .orElse(null); // questionable. consider redesigning to avoid null. 
+0

は素敵行わ。 +1は「nullを避けるための再設計を検討する」ためです。 –

関連する問題