2015-06-25 19 views
20

Ho questo codice:Come si esegue iterazione su uno streaming in Java usando?

List<String> strings = Arrays.asList("a", "b", "cc"); 
for (String s : strings) { 
    if (s.length() == 2) 
     System.out.println(s); 
} 

voglio scrivere utilizzando un filtro e un lambda:

for (String s : strings.stream().filter(s->s.length() == 2)) { 
    System.out.println(s); 
} 

ottengo Can only iterate over an array or an instance of java.lang.Iterable.

cerco:

for (String s : strings.stream().filter(s->s.length() == 2).iterator()) { 
    System.out.println(s); 
} 

e ottengo lo stesso errore. È possibile? Preferirei davvero non eseguire stream.forOach() e passare un consumatore.

Modifica: è importante per me non copiare gli elementi.

+3

Se utilizzare un 'Stream', perché iterare in primo luogo? Nota: il tuo codice può essere scritto 'strings.stream(). Filter (s -> s.length() == 2) .forEach (System.out :: println)' – fge

+0

In realtà ho una grossa fetta di codice che elabora il codice elemento e non voglio refactoring troppo se possibile – ytoledano

+2

Quindi non refactoring se funziona. Usare gli stream per il gusto di usare gli stream non è il modo di usare gli stream: p – fge

risposta

19

È necessario un iterabile per essere in grado di utilizzare un per-ogni ciclo, ad esempio una raccolta o un array:

for (String s : strings.stream().filter(s->s.length() == 2).toArray(String[]::new)) { 

alternativa, è possibile eliminare completamente del ciclo for:

strings.stream().filter(s->s.length() == 2).forEach(System.out::println); 

Lei parla non si vuole refactoring del ciclo for, ma si potrebbe estrarre il suo corpo in un altro metodo:

strings.stream().filter(s->s.length() == 2).forEach(this::process); 

private void process(String s) { 
    //body of the for loop 
} 
+2

Does toArray() copia gli elementi? Ho dimenticato di menzionarlo nella domanda orig, ma preferirei davvero non copiarlo. – ytoledano

+1

@ytoledano sì creerebbe un nuovo array e copierà i riferimenti all'elemento nell'array. – assylias

+0

Grazie, lo tengo così com'è. – ytoledano

Problemi correlati