2016-06-17 6 views
4

Ich bin ziemlich neu in Streams.Java, suche nach einem Element, wenn nicht gefunden, füge es hinzu

Ich möchte die geometriesEC_Geometry Arraylist streamen und wenn das EC_Geometry Element nicht vorhanden ist (oder besser equals nie true zurückkehrt), dann füge ich hinzu.

public void init(GL3 gl3, EC_Mesh mesh) { 

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

Aber ich bin in der letzten Zeile stecken

Wie kann ich es Streams mit lösen?

Bitte beachten Sie, dass equals eine Methode, die ich überprüft schrieb, wenn die Geometrie der gleiche ist (dh: wenn die Dreiecke entsprechen)

+0

was fügen Sie damit hinzu? 'geometries :: add' – Olayinka

+0

Es war ein schlechter Versuch die' mesh.getGeometry() 'zu' geometries' hinzuzufügen – elect

+1

Beachten Sie, dass Ihr Filter als 'mesh.getGeometry() :: equals' geschrieben werden könnte. –

Antwort

4

orElse immer ausgeführt wird, auch wenn der Wert nicht verwendet wird zurückgeführt, so ist es vorzuziehen, Verwenden Sie orElseGet hier, die nur ausgeführt werden, wenn nichts gefunden wird.

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

Danke! Es scheint zu funktionieren. Ps: ein Semikolon fehlt am Ende der 'add' Methode, ich kann nicht nur ein Zeichen ändern – elect

+3

' .filter (mesh.getGeometry() :: equals) 'vermeidet den Aufruf von' getGeometry() 'für jedes Stream Element ... – Holger

+0

Können Sie das ausarbeiten, Holger? – elect

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

ist für Optional - wenn Sie gefunden erste Element erhalten möchten.

Für das, was Sie möchten, dass der beste Ansatz zu erreichen, wäre nur zu:

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

Keine Notwendigkeit, Übernutzung Stream-API.

+0

Ich änderte die Frage, um es klarer zu machen, dass ich nicht nach Java 'Obejct' Vergleich suche – elect

+0

Oh gut. Ich habe es wenigstens versucht. Viel Spaß mit Streams @elect :) –

+3

@elect: Es ändert sich nicht die Tatsache, dass dies die einfachste, unkomplizierte Lösung ist und die Verwendung eines Streams stattdessen keine Verbesserung darstellt. – Holger