weblog@kentama

技術的なメモ置き場。主にJava。

Java9 Stream APIの追加メソッド

Java9の新機能を試す。今回はStream APIの追加メソッド。

takeWhile(Predicate predicate)

predicateのtestメソッドがtrueを返すまで要素を取得する。

// 1, 2を出力
List.of(1, 2, 3, 4, 5).stream()
    .takeWhile(i -> i != 3).forEach(System.out::println);
// 1, 2, 3, 4を出力
List.of(1, 2, 3, 4, 5).stream()
    .takeWhile(i -> i != 5).forEach(System.out::println);

dropWhile(Predicate predicate)

takeWhileの逆。
predicateのtestメソッドがtrueを返すまで要素を破棄。

// 3, 4, 5を出力
List.of(1, 2, 3, 4, 5).stream()
    .dropWhile(i -> i != 3).forEach(System.out::println);
// 5を出力
List.of(1, 2, 3, 4, 5).stream()
    .dropWhile(i -> i != 5).forEach(System.out::println);

takeWhileとdropWhileの注意点

順序付けられていないストリームを扱うときは出力結果が変わるので注意が必要。

// 3, 2, 1, 5, 4 を出力したり
// 3, 1 を出力したり毎回異なる
Set.of(1, 2, 3, 4, 5).stream()
    .dropWhile(i -> i != 3).forEach(System.out::println);

ofNullable(T t)

渡される値がnullの場合に要素が0個のストリームを返す。
渡される値がnullではない場合に要素が1個のストリームを返す。

// 0
Stream.ofNullable(null).count();
// 1
Stream.ofNullable("Foo").count();

iterate(T seed, Predicate<? super T> hasNext, UnaryOperator next)

ストリームでfor文と同じことができる。

// 0, 1, 2, 3, 4, 5を出力
Stream.iterate(0, i -> i < 5, i -> i + 1).forEach(System.out::println);