2015-08-11 30 views
5

Próbowałem napisać następujący kod jako strumień:Dlaczego ten strumień nie zwraca żadnego elementu?

AbstractDevice myDevice = null; 

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

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

} 

ten kod działa poprawnie.

Ale kiedy go przerobić tak, że już nie działa:

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

Optional której wrócę ze strumienia nie ma wartości w nim. Czemu?

EDIT

Kiedy próbuję to (ja wciąż dostać dwa urządzenia z powrotem getDevices()):

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

testList jest pusty. Wygląda więc na to, że coś jest nie tak ze strumieniem mojego urządzenia List?

Jest to aplikacja JavaEE i dostaję moje urządzenia z odpowiedniej jednostki:

@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

Czy możesz podać krótki, ale kompletny program demonstrujący problem? Trudno jest zdiagnozować bez możliwości odtworzenia go. –

+4

Oryginalny kod otrzyma ostatni zgodny element z listy, a kod strumienia otrzyma pierwszy. Nie wiem, czy to jest problem w tym przypadku. – WillShackleford

+1

"* Lista, którą otrzymuję z sesji session.getWorkplace.getDevices() ma dwa obiekty *" czy jesteś tego pewien? Również Twoje rozwiązanie nie-strumieniowe wydaje się znajdować ostatni mecz, a nie pierwszy. – Pshemo

Odpowiedz

6

Wydaje się, że używasz EclipseLink przed wersją 2.6 i uderzyć Bug#433075. To pole devices zostało zastąpione przez IndirectList (przez odbicie), co rozszerza klasę Vector i wykonuje leniwą inicjalizację. Został napisany dla starszej wersji Java, która nie miała metody stream(), więc stream() jest wywoływany na niezainicjowanej liście zwracającej pusty strumień.

Błąd to fixed, więc prawdopodobnie musisz zaktualizować wersję EclipseLink do wersji 2.6. W EclipseLink 2.6 inna klasa to used when running on JDK 1.8, która jest przyjazna strumieniowo.

+0

Dzięki! Ale niestety nadal jest to błąd w wersji 2.6, gdy używam @OrderColumn –

+2

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

+1

@ Swiss_Codeaholic, widzę. Szkoda. Możesz wywołać coś takiego jak 'devices.isEmpty()', aby wymusić inicjalizację, ale proponuję nie używać stream API, dopóki nie zostanie wydana następna wersja. –