山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

【Java】Stream を理解する その2(Stream 生成編)

Java の Stream について全 4 回中の2回目。

公式ドキュメントはこちら。
Stream (Java Platform SE 8)

今回は Stream の生成について書いていこうと思います。

参考にさせてもらったサイトです。すごく詳細まで記載されている良記事でした。
Java8 Stream API ストリーム生成 - abcdefg.....

range、rangeClosed による生成

IntStream や LongStream に用意されているメソッドです。

IntStream.range(1, 5).forEach(a -> System.out.print(a + " ")); // 1 2 3 4
System.out.println();

IntStream.rangeClosed(1, 5).forEach(a -> System.out.print(a + " ")); // 1 2 3 4 5
System.out.println();

LongStream.range(1L, 5L).forEach(a -> System.out.print(a + " ")); // 1 2 3 4
System.out.println();

LongStream.rangeClosed(1L, 5L).forEach(a -> System.out.print(a + " ")); // 1 2 3 4 5
System.out.println();

Arrays.stream(array) による生成

配列から Stream を生成します。

引数に int 型を渡すと IntStream が生成されます。long、double も同様に対応したプリミティブ型用の Stream を返します。

引数に参照型の配列(String など)を渡すと Stream が返ります。

// プリミティブ型の例
int[] intArray = { 0, 5, 10, 15, 20 };
Arrays.stream(intArray).forEach(a -> System.out.print(a + " ")); // 0 5 10 15 20
System.out.println();

// 参照型の例
String[] stringArray = { "a", "b", "c", "d", "e" };
Arrays.stream(stringArray).forEach(a -> System.out.print(a + " ")); // a b c d e
System.out.println();

List#stream(list) による生成

List から Stream を生成します。

List<String> stringList = Arrays.asList(new String[] { "a", "b", "c", "d", "e" });
stringList.stream().forEach(a -> System.out.print(a + " ")); // a b c d e
System.out.println();

Stream.iterate(seed, func) による生成

IntStream、LongStream、DoubleStream にも同様のメソッドがあります。

第一引数に初期値を与え、最初はその初期値を用いて以降の中間操作 or 終端操作を行い、2回目は初期値を引数に取って第二引数の関数が呼ばれ、戻り値を用いて以降の中間操作 or 終端操作を行います。3回目は2回目の結果を引数にとって・・・(以下ループ)。

無限順次 Stream なので Stream#limit を用いて要素数を制限する必要があります。limit を忘れると例外が発生せず無限ループになります。

Stream.iterate(1, i -> i + 2)
  .limit(5)
  .forEach(i -> System.out.print(i + " ")); // 1 3 5 7 9 
System.out.println();

その他の生成方法

ここまでに書いた内容で大半のケースは事足りるでしょうが、ほかの生成方法も紹介しておきます。

  • Stream.generate(func)、IntStream.generate(func)、LongStream.generate(func)、DoubleStream.generate(func)
  • Stream.concat(stream1, stream2)
  • IntStream.concat(intStream1, intStream2)
  • LongStream.concat(longStream1, longStream2)
  • DoubleStream.concat(doubleStream1, doubleStream2)
  • String#chars()
  • String#codePoints()
  • Random#ints()、Random#longs()、Random#doubles()
  • Stream.empty()、IntStream.empty()、LongStream.empty()、DoubleStream.empty()
  • BufferReader#lines()
  • Files.lines(path)
  • Files.find()、Files.list()、Files.walk()

まとめ

今回は Stream 生成方法について具体的な方法をまとめました。

次回は中間操作について記事にしたいと思います。

それでは!

独習Java 新版

独習Java 新版

やさしいJava 第7版 (「やさしい」シリーズ)

やさしいJava 第7版 (「やさしい」シリーズ)

Effective Java 第3版

Effective Java 第3版