1. ホーム
  2. java

[解決済み] 配列からストリームを作成する方法を教えてください。

2022-06-05 03:19:48

質問

現在、配列からストリームを作成する必要がある場合、私は以下のようにしています。

String[] array = {"x1", "x2"};
Arrays.asList(array).stream();

配列からストリームを作成する直接的な方法はありますか?

どのように解決するのですか?

Arrays.streamを使用することができます。

Arrays.stream(array);

また Stream.of を使うこともできます。

public static<T> Stream<T> of(T... values) {
    return Arrays.stream(values);
}

ただし Stream.of(intArray)Stream<int[]> 一方 Arrays.stream(intArr)IntStream 型の配列を渡すと int[] . つまり,プリミティブ型では,2つのメソッドの違いを簡単に観察することができます。

int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);

IntStream stream2 = Arrays.stream(arr); 

プリミティブ配列を Arrays.stream に渡すと、以下のコードが実行されます。

public static IntStream stream(int[] array) {
    return stream(array, 0, array.length);
}

で、プリミティブ配列を Stream.of に渡すと、以下のコードが実行されます。

 public static<T> Stream<T> of(T t) {
     return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
 }

したがって、異なる結果を得ることができます。

更新 : によって言及されたように スチュアート・マークス コメント のサブレンジのオーバーロードは Arrays.stream を使うのが望ましいです。 Stream.of(array).skip(n).limit(m) を使うのが望ましいです。前者はSIZEDストリームになるのに対し、後者はそうならないからです。その理由は limit(m) はサイズが m か m 未満か分からないのに対して Arrays.stream は範囲チェックを行い、ストリームの正確なサイズを知っています。 によって返されるストリームの実装のソースコードを読むことができます。 Arrays.stream(array,start,end) ここで で返されるストリームの実装に対して Stream.of(array).skip().limit() このメソッド .