web-dev-qa-db-fra.com

Comment puis-je parcourir un flux dans Java en utilisant pour?

J'ai ce code:

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

Je veux l'écrire en utilisant un filtre et un lambda:

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

Je reçois Can only iterate over an array or an instance of Java.lang.Iterable.

J'essaie:

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

Et je reçois la même erreur. Est-ce seulement possible? Je préférerais vraiment ne pas stream.forEach () et transmettre un consommateur.

Edit: il est important pour moi de ne pas copier les éléments.

35
ytoledano

Vous devez avoir un itératif pour pouvoir utiliser une boucle for-each, par exemple une collection ou un tableau:

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

Alternativement, vous pouvez vous débarrasser complètement de la boucle for:

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

Vous dites que vous ne voulez pas refactoriser votre boucle for, mais vous pouvez en extraire le corps avec une autre méthode:

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

private void process(String s) {
  //body of the for loop
}
33
assylias