Javaの8 - ストリームが消費され、エラーを与えて操作しますが、別のケースでは、そのことされたら

ジェフ・クック:

私は、Java 8の新しいですと、2つのシナリオの違いを理解するために探して。私は、ストリームを操作して、消費その後、ストリームを再利用することカントされた後、再び、それはエラーを与えることを知っています。

シナリオ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.

私はこれを実行すると、私は公正である...エラーの下に取得します。

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)

シナリオ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);

ここにも私は、なぜ私はすべてのエラーを取得していない、ストリームを操作すると、端末の動作を閉じていますか?

Ousmane D .:

するために、2つのコールs.forEachの呼び出しに対し、最初の例では、したがって例外同じストリームを利用stream()> -方法numbers.stream() 各回(収率)新しいストリームを生成し、したがってdoesntのスローストリームが既に際に操作されている:」java.lang.IllegalStateExceptionをまたは」閉じました

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=136429&siteId=1