2016-06-17 6 views
4

私はストリームにかなり慣れています。Java、要素が見つからない場合は、それを追加してください。

EC_Geometry要素が存在しない場合、私はその後、私はそれを追加し、(またはequalsより良いtrueを返すことはありません)geometriesEC_GeometryのArrayListをストリーミングしたいとします。

public void init(GL3 gl3, EC_Mesh mesh) { 

    geometries.stream() 
      .filter(geometry -> mesh.getGeometry().equals(geometry)) 
      .findAny() 
      .orElse(..?); 
} 

しかし、私は

どのようにストリームを使用してそれを解決することができ、最後の行で立ち往生していますか?ジオメトリが同じであれば

equalsは、私がチェック書いた方法であることに注意してください(例:三角形が対応する場合)

+0

これで何を追加していますか? 'geometries :: add' – Olayinka

+0

' mesh.getGeometry() 'を' geometries'に追加するのは悪い試みでした。 – elect

+1

あなたのフィルターは 'mesh.getGeometry():: equals'と書くことができます。 –

答えて

4

orElseことがより望ましいので、常に返された値が使用されていない場合でも実行されますorElseGetを使用してください。何も見つからない場合にのみ実行されます。

geometries.stream() 
      .filter(geometry -> mesh.getGeometry().equals(geometry)) 
      .findAny() 
      .orElseGet(() -> { 
       geometries.add(mesh.getGeometry()); 
       return mesh.getGeometry(); 
      }); 
+0

ありがとう!それは働いているようだ。 ps: 'add'メソッドの最後にセミコロンがないので、ただ一つの文字を変更することはできません。 – elect

+3

' .filter(mesh.getGeometry():: equals) 'は各ストリーム要素に対して' getGeometry() 'を呼び出さないようにします... – Holger

+0

あなたは精巧にできますか、ホルガー? – elect

2
.findAny().orElse(..?); 

はオプションです - あなたが最初に見つかった要素を取得したいと思います。

meshG = mesh.getGeometry(); 
if (!geometries.contains(meshG)) { 
    geometries.add(meshG); 
} 

ストリームAPIを酷使する必要はありません:あなたが最善のアプローチを実現したいと思います何のため

だけになります。

+0

私は、Java 'Obejct'の比較を探していないことを明確にするために質問を修正しました – elect

+0

ああ。私は挑戦はした。ストリーム@楽しみで楽しんでください:) –

+3

@elect:これは単純で直進的な解決策であり、代わりにストリームを使用することは改善ではないという事実は変わりません。 – Holger

関連する問題