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.
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
}