2016-05-11 13 views
0

Ich bin sehr neu in Java 8 Funktionen wie Streams, Filter und Sachen und die Wahrheit sagen, ich habe nicht in Java seit mehr als einem Jahr geschrieben. Hier ist mein Problem, wenn jemand einen Vorschlag geben könnte.Abrufen von Daten aus db mit Java-Streams

@Override 
public ArrayList<Agent> getAllEnabledAgents() throws Exception {  
    ArrayList<Agent> agents = repository.all(); //redis repository 
    Stream<Agent> result = agents.stream().filter(a-> a.equals(a.getConfigState().Enabled)); //enum 
    return result; //I dont know how to return result or whether I am using stream correctly. 

} 

Die Hauptidee ist, dass ich alle aktivierten Agenten zurückgeben möchte. gerConfigState() gibt eine enum (__ConfigState) zurück. nicht sicher Wenn ich das richtig mache.

+1

Warum alle aus der Datenbank holen und dann die aktivierten im Speicher filtern? Das ist keine gute Idee. Holen Sie einfach die aktivierten aus der Datenbank mit einem Kriterium (Where-Klausel). – STaefi

Antwort

1

Verwenden Sie die collect -Methode der Stream. Auch Ihr Filter sieht etwas komisch aus, da die Variable a ein Objekt der Klasse Agent ist.

Also vielleicht so etwas wie diese:

agents.stream() 
     .filter(a -> a.getConfigState() == Enabled) 
     .collect(Collectors.toList()); 

Dann wieder, wie die Kommentar-Staaten, könnten Sie einfach besser dran, diese Filterung mit einer Abfrage.

+0

Ich denke, es sieht komisch aus. Was ist mit der Rückkehr? Ich habe versucht, Ihren Code (und andere Sachen auch), aber es meckert meist "Kann nicht konvertieren von Liste zu Stream

+0

Ich habe dies gestern versucht. Das Ergebnis war etwas wie das kann ich enum Zustand nicht vergleichen. GetConfigState() gibt Enum-Status nicht ein boolean zurück –

+0

Wo meckert es darüber? Welche Zeile? Wenn getConfigState() eine Enum-Konstante zurückgibt, sollten Sie in der Lage sein, es mit einer anderen Enum-Konstante zu vergleichen – Tobb

1

Ihre Filterbedingung ist nicht korrekt (ich nehme an, getConfigState() gibt eine enum zurück). Sie können etwas wie unten verwenden:

Stream<Agent> streamAgent = agents.stream().filter(a-> a.getConfigState() == Enabled);  
return streamAgent.collect(Collectors.toList()); 
+0

So mache ich es und es doesn ‚t beschweren: Strom result = agents.stream() \t \t \t \t Filter (a-> a.getConfigState() gleich ("freigegeben").); . Ich werde einen Junit-Test schreiben, um int zu chek. Noch eine Sache ... es ist notwendig, bei der Rückkehr zu werfen. –

+0

Sie können equals() oder == verwenden, um enum zu vergleichen. Die Vor- und Nachteile diskutierten hier schon. http://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals. Ich würde == als sicherer bevorzugen. – Vijay

+0

Sie vergleichen auch die Enum-Zeichenfolge und nicht das Enum selbst. Sie sollten a.getConfigState(). Equals (Enabled) verwenden, wobei die tatsächliche enum übergeben wird, nicht der String. – Vijay

0

Danke für die Hilfe. Dies ist die endgültige Version:

@Override 
public List<Agent> getAllEnabledAgents() throws Exception { 
     return repository.all() 
      .stream() 
      .filter(a-> a.getConfigState() == ConfigState.Enabled) 
      .collect(Collectors.toList()); 
} 
Verwandte Themen