2015-08-11 5 views
5

Ich habe versucht, den folgenden Code als Stream zu schreiben:Warum gibt dieser Stream kein Element zurück?

AbstractDevice myDevice = null; 

for (AbstractDevice device : session.getWorkplace().getDevices()) { 

    if (device.getPluginconfig().getPluginType().getId() == 1) { 
     myDevice = device; 
    } 

} 

dieser Code funktioniert gut.

Aber wenn ich es so umschreiben es nicht mehr funktioniert:

myDevice = session.getWorkplace().getDevices().stream() 
        .filter(s -> s.getPluginconfig().getPluginType().getId() == 1) 
        .findFirst().get(); 

Die Optional, die ich aus dem Strom erhalten hat darin keine Werte. Warum?

EDIT

Wenn ich das versuchen (ich zwei Geräte von getDevices() immer noch zurück):

List<AbstractDevice> testList = session.getWorkplace().getDevices() 
             .stream().collect(Collectors.toList()); 

die testList leer. So scheint es wie etwas schief geht mit dem Strom meiner List Geräte?

Es ist eine JavaEE Anwendung und ich meine Geräte aus der entsprechenden Einheit:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) 
@JoinTable(name = "Workplace_AbstractDevice", 
      joinColumns = { 
       @JoinColumn(name = "Workplace", referencedColumnName = "ID") 
      }, 
      inverseJoinColumns = { 
       @JoinColumn(name = "AbstractDevice", referencedColumnName = "ID") 
      }) 
@OrderColumn 
private List<AbstractDevice> devices = new ArrayList<AbstractDevice>(); 


public List<AbstractDevice> getDevices() { 
    return devices; 
} 
+7

Können Sie ein kurzes, aber vollständiges Programm zur Veranschaulichung des Problems bereitstellen? Es ist schwer zu diagnostizieren, ohne es reproduzieren zu können. –

+4

Der ursprüngliche Code würde das letzte übereinstimmende Element von der Liste entfernen, während der Stream-Code den ersten erhalten würde. Ich weiß nicht, ob das in diesem Fall das Problem ist. – WillShackleford

+1

"* Die Liste, die ich von session.getWorkplace.getDevices() zurückbekomme, enthält zwei Objekte *" Bist du dir sicher? Auch Ihre Nicht-Stream-Lösung scheint die letzte Übereinstimmung zu finden, nicht die erste. – Pshemo

Antwort

6

Es scheint, dass Sie Eclipse verwenden vor der Version 2.6 und trafen die Bug#433075. Dieses Feld devices wird durch IndirectList (über Reflektion) ersetzt, wodurch die Vector-Klasse erweitert und eine verzögerte Initialisierung durchgeführt wird. Es wurde für eine ältere Java-Version geschrieben, die keine stream()-Methode hatte, so dass die stream() tatsächlich auf nicht initialisierte Liste aufgerufen wird, die einen leeren Stream zurückgibt.

Der Fehler ist fixed, also müssen Sie wahrscheinlich die EclipseLink Version 2.6 aktualisieren. In EclipseLink 2.6 ist eine andere Klasse used when running on JDK 1.8, die Stream-freundlich ist.

+0

Danke !! Aber leider ist es immer noch ein Fehler in 2.6 bei der Verwendung von @OrderColumn –

+2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=467470 –

+1

@Swiss_Codeaholic, ich sehe. Das ist schade. Sie können etwas wie 'devices.isEmpty()' aufrufen, um die Initialisierung zu erzwingen, aber ich würde vorschlagen, die Stream API nicht zu verwenden, bis die nächste Version veröffentlicht wird. –