Java の Stream について全 4 回中の2回目。
- 【Java】Stream を理解する その1(概要編)
- 【Java】Stream を理解する その2(生成編) ← この記事
- 【Java】Stream を理解する その3(中間操作 編)
- 【Java】Stream を理解する その4(終端操作 編)
公式ドキュメントはこちら。
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 新版](https://images-fe.ssl-images-amazon.com/images/I/51Pr9D1T5-L._SL160_.jpg)
- 作者: 山田祥寛
- 出版社/メーカー: 翔泳社
- 発売日: 2019/05/15
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
![やさしいJava 第7版 (「やさしい」シリーズ) やさしいJava 第7版 (「やさしい」シリーズ)](https://images-fe.ssl-images-amazon.com/images/I/51hgFItEcxL._SL160_.jpg)
- 作者: 高橋麻奈
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2019/01/22
- メディア: 単行本
- この商品を含むブログを見る
![Effective Java 第3版 Effective Java 第3版](https://images-fe.ssl-images-amazon.com/images/I/41WZElZb9eL._SL160_.jpg)
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2018/10/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る