Java 8 - Une fois flux est consommé et exploité donnant erreur, mais dans un autre cas, ce ne est pas

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.forEachutiliser 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é » .

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=136430&siteId=1
conseillé
Classement