2015-06-25 12 views
20

mam ten kod:W jaki sposób mogę wykonać iterację strumienia w języku Java, używając?

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

Chcę napisać go za pomocą filtra i lambda:

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

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

Staram:

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

I uzyskać ten sam błąd. Czy to możliwe? Naprawdę wolałbym nie robić stream.forEach() i przekazywać konsumenta.

Edycja: ważne jest, aby nie kopiować elementów.

+3

Jeśli użyj 'Stream', po co iterować w pierwszej kolejności? Uwaga: Twój kod może być napisany 'strings.stream(). Filter (s -> s.length() == 2) .forEach (System.out :: println)' – fge

+0

Rzeczywiście mam duży fragment kodu przetwarzającego element i nie chcę go zbyt dużo refaktoryzować, jeśli to możliwe – ytoledano

+2

Po prostu nie refaktoryzuj jeśli działa. Używanie strumieni w celu używania strumieni nie jest sposobem na użycie strumieni: p – fge

Odpowiedz

19

Państwo potrzebować iterable, aby móc użyć dla-każdej pętli, na przykład zbieranie lub tablicy:

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

Alternatywnie, można całkowicie pozbyć się pętli for:

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

można wspomnieć, że nie chcesz być zmiana na pętli, ale można wyodrębnić swoje ciało w inny sposób:

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

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

Czy toArray() kopiuje elementy? Zapomniałem wspomnieć o tym w pytaniu źródłowym, ale wolałbym nie kopiować. – ytoledano

+1

@ytoledano tak, aby utworzyć nową tablicę i skopiować odniesienia do elementu do tablicy. – assylias

+0

Dzięki, zachowam to tak, jak jest. – ytoledano

Powiązane problemy