2017-01-30 1 views
9

J'essaye de migrer de Guava vers Java 8 Streams, mais je n'arrive pas à comprendre comment gérer les itérations. Voici mon code, pour supprimer des chaînes vides du itérables:Comment remplacer Iterables.filter() avec Streams?

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

Faites attention, c'est un Iterable, pas Collection. Il peut contenir un illimité quantité d'éléments, je ne peux pas tout charger dans la mémoire. Quelle est mon alternative Java 8?

BTW, avec Lamba ce code sera encore plus court:

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

De quel type est 'raw'? – shmosel

+0

Quelle est la version de Guava? Ou ne voulez-vous pas utiliser la goyave? – shmosel

+0

@shmosel Je veux me débarrasser de Guava et migrer vers Java 8 Streams, si c'est possible. Peut-être que non. C'est pourquoi demander ici. – yegor256

Répondre

8

Vous pouvez implémenter Iterable comme une interface fonctionnelle en utilisant Stream.iterator():

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

'iterator()' renvoie une instance de 'Iterator', pas' Iterable' – yegor256

+1

@ yegor256 Lisez-le plus attentivement. Ou essayez-le. – shmosel

+1

l'ai eu, mon mauvais. Merci! – yegor256