ストリームAPI(StreamAPI)
-
繰り返し処理をサポートするライブラリ
-
コレクション、配列、ファイルなどのデータの集合(データソース)から要素を取り出し処理の流れ(Stream)に引き渡す。
-
中間処理
: 戻り値はStream -
終端処理
: 終端処理のタイミングでうとりーむ一連の処理が実行される -
メソッドチェーン : ストリーム生成から中間処理/終端演算子.演算子で連結できる
リスト・マップ
//リスト
var list = new ArrayList<String>(
Arrays.asList("ant", "elephant", "hamster"));
list.stream()
.forEach(System.out::println);
// 並列処理
list.parallelStream().forEach(System.out::println);
//マップ
var map = new HashMap<String, String>(
Map.of("orange", "みかん", "apple", "りんご", "strawberry", "いちご"));
map.entrySet()
.stream()
.forEach(System.out::println);
Arraysクラスのstreamメソッド
int[] numbers = {1, 2, 3, 4, 5};
Arrays.stream(numbers)
.filter(n -> n % 2 == 0) // 偶数をフィルタリング
.map(n -> n * n) // 要素を自乗する
.forEach(System.out::println); // 出力: 4, 16
①:numbers配列をstream()メソッドでストリームに変換
②:続けてfilter()[predicate]メソッドで偶数をフィルタリング
③:map()[Function]メソッドで要素を自乗
④:forEach()[Consumer]メソッドを使用して、処理結果を出力
プリミティブ型の配列(Int、long、doubleなど)を扱う場合、Stream型(参照型)ではなくプリミティブ型の戻り値を戻すため注意する。
引数/ラムダ式
- ofメソッド
var stream = Stream.of("first", "second", "third");
stream.forEach(System.out::println); //first, second, third
-
generare
メソッド- 指定されたラムダ式(
Supplier
)の戻り値でストリーム生成- ex: 1~100の乱数を生成、ストリーム化
- 無限にストリーム生成するので中間/終端処理で明示的に中断
- 以下の例ではlimit(10)で先頭10件のみ処理している
- 指定されたラムダ式(
var stream = Stream.generate(() -> {
var r = new Random();
return r.nextInt(100);
});
stream.limit(10)
.forEach(System.out::println);
//46 24 42 80 61 67 69 22 85 1
-
iterate
メソッド- 指定された初期値とラムダ式(
UnaryOperator
)でストリーム生成- 第一引数に初期値、第二引数に直前の結果を渡す
- 指定された初期値とラムダ式(
var stream = Stream.iterate(1, (num) -> {
return num * 2;
});
stream.limit(10)
.forEach(System.out::println);
// 1 2 4 8 16 32 64 128 256 512
- builderメソッド
- ストリームを組み立てるためのStream.Builderオブジェクト生成
var stream1 = Stream.of("Munchkin", "Siamese", "Persian");
var stream2 = Stream.of("Corgi", "Poodle", "Shiba");
Stream.concat(stream1, stream2).forEach(System.out::println);
// Munchkin Siamese Persian
// Corgi Poodle Shiba
- concatメソッド
- 複数のストリームを結合し1つのストリームにまとめる
var stream1 = Stream.of("Munchkin", "Siamese", "Persian");
var stream2 = Stream.of("Corgi", "Poodle", "Shiba");
Stream.concat(stream1, stream2).forEach(System.out::println);
// Munchkin Siamese Persian
// Corgi Poodle Shiba