Jeff Cook:
Je suis nouveau à Java 8 et cherchent à comprendre la différence entre les deux scénarios. Je sais qu'une fois qu'un flux est exploité et consommé ensuite être réutilisé courant ne peut pas encore, il donnera une erreur.
Scénario 1:
List<String> title = Arrays.asList("Java8", "In", "Action");
Stream<String> s = title.stream();
s.forEach(System.out::println);
s.forEach(System.out::println); // THIS WILL GIVE ERROR - streams has been already operated and closed.
Quand je cours, je reçois ci-dessous erreur ... ce qui est juste.
Java8
In
Action
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.sourceStageSpliterator(Unknown Source)
at java.util.stream.ReferencePipeline$Head.forEach(Unknown Source)
at com.test.Java8InAction.CH4.TraversableOnlyOnce.main(TraversableOnlyOnce.java:12)
Scénario 2:
// Filtering unique elements
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
numbers.stream().forEach(System.out::println);
numbers.stream().filter(n -> n % 2 == 0).distinct().forEach(System.out::println);
numbers.stream().filter(n -> n % 2 == 0).forEach(System.out::println);
Ici aussi, je l'ai exploité courant et fermé l'exploitation du terminal, alors pourquoi je n'ai pas eu d'erreur?
Ousmane D. :
Les deux appels à s.forEach
utiliser le même flux d' où l'exception dans le premier exemple alors que l'appel à la stream()
méthode -> numbers.stream()
génère (rendements) un nouveau flux à chaque fois où ne marche pas jeter un « java.lang.IllegalStateException: flux a déjà été opéré ou fermé » .