2017-01-30 6 views
9

Ich versuche, von Guava zu Java 8 Streams zu migrieren, kann aber nicht herausfinden, wie ich mit Iterablen umgehen soll. Hier ist mein Code, um leere Zeichenfolgen aus der iterable zu entfernen:Wie Iterables.filter() durch Streams ersetzen?

Iterable<String> list = Iterables.filter(
    raw, // it's Iterable<String> 
    new Predicate<String>() { 
    @Override 
    public boolean apply(String text) { 
     return !text.isEmpty(); 
    } 
    } 
); 

Pay Aufmerksamkeit, es ist ein Iterable, kein Collection. Es kann möglicherweise eine unbegrenzte Anzahl von Elemente enthalten, ich kann nicht alles in den Speicher laden. Was ist meine Java 8 Alternative?

BTW, mit Lamba wird dieser Code aussehen sogar noch kürzer:

Iterable<String> list = Iterables.filter(
    raw, item -> !item.isEmpty() 
); 
+0

Welche Art ist 'raw'? – shmosel

+0

Welche Version von Guava bist du? Oder möchten Sie Guava überhaupt nicht benutzen? – shmosel

+0

@shmosel Ich möchte Guava loswerden und zu Java 8 Streams migrieren, wenn das überhaupt möglich ist. Vielleicht ist es nicht. Deshalb fragen Sie hier. – yegor256

Antwort

8

Sie Iterable als funktionale Schnittstelle implementieren kann Stream.iterator() mit:

Iterable<String> list =() -> StreamSupport.stream(raw.spliterator(), false) 
     .filter(text -> !text.isEmpty()) 
     .iterator(); 
+0

'iterator()' gibt eine Instanz von 'Iterator' zurück, nicht 'Iterable' – yegor256

+1

@ yegor256 Lies es sorgfältiger. Oder probier es aus. – shmosel

+1

habe es, mein schlechtes. Vielen Dank! – yegor256