public class ZippedStream
extends java.lang.Object
of(Stream, Stream)| 修飾子とタイプ | メソッドと説明 |
|---|---|
static <T,U> java.util.stream.Stream<Pair<T,U>> |
of(java.util.stream.Stream<? extends T> stream1,
java.util.stream.Stream<? extends U> stream2)
2つのソースストリームの要素をペアリングして得られる要素をソースとする順次ストリームを生成します。
|
public static <T,U> java.util.stream.Stream<Pair<T,U>> of(java.util.stream.Stream<? extends T> stream1, java.util.stream.Stream<? extends U> stream2)
1, 2, 3, ..."a", "b", "c", ...(1, "a"), (2, "b"), (3, "c"), ...(1, "a"), (2, "b"), (3, "c"), ... というストリームのみならず、
(2, "a"), (3, "b"), (1, "c"), ... というストリームも生成され得ます。これらはいずれも正当な結果とみなされます。
このことが好ましくない場合は、Stream.sorted() 等により得られる順序付けされたストリームをソースとするようにしてください。BaseStream.spliterator() により得られる Spliterator を介して構築されます。
従って、大元のソースがスレッドセーフであっても、そのソースの反復操作を行う際に手動で同期をとる必要がある場合は、
生成されたストリームのストリーム・パイプラインにおける大元のソースに対する操作は、スレッドセーフにはなりません。ConcurrentModificationException がスローされて処理が失敗します。
List<Integer> threadSafeList = Collections.synchronizedList(new ArrayList<>(Arrays.asList(1, 2, 3)));
Stream<Integer> stream1 = threadSafeList.stream();
Stream<String> stream2 = Arrays.asList("a", "b", "c", "d", "e").stream();
ZippedStream.of(stream1, stream2)
.peek(p -> threadSafeList.add(p.m1() + 3)) // ここで例外が発生する。
.forEach(Pair::toString);
threadSafeList はスレッドセーフですが、それに対する反復処理に際しては手動で同期をとる必要があります。
上の例ではそれがなされないまま threadSafeList に対する更新操作を行っているため、例外が発生します。Collections.synchronizedList(List) の説明を参照してください。T - ソースストリーム1の要素の型U - ソースストリーム2の要素の型stream1 - ソースストリーム1stream2 - ソースストリーム2java.lang.NullPointerException - stream1、stream2 のいずれかが null の場合java.lang.IllegalArgumentException - stream1 と stream2 が同一インスタンスの場合Stream,
Spliterator