weblog

技術的なメモ置き場。

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);

Java9 Optionalの追加メソッド

Java9の新機能を試す。 今回はOptionalに追加されたメソッド。

ifPresent(Consumer action)

値が存在する場合のみactionを実行する。

// Foo が出力される
Optional.ofNullable("Foo").ifPresent(System.out::println);
// 何も出力されない
Optional.ofNullable(null).ifPresent(System.out::println);

ifPresentOrElse(Consumer action, Runnable emptyAction)

値が存在する場合はactionを実行する。
値が存在しない場合はemptyActionを実行する。

// Foo が出力される
Optional.ofNullable("Foo").ifPresentOrElse(
        System.out::println, () -> System.out.println("Bar"));
// Bar が出力される
Optional.ofNullable(null).ifPresentOrElse(
        System.out::println, () -> System.out.println("Bar"));

or(Supplier supplier)

値が存在する場合はそのOptionalを返す。
値が存在しない場合はsupplierが返すOptionalを返す。

// Foo が出力される
Optional.ofNullable("Foo").or(() -> Optional.of("Bar")).ifPresent(System.out::println);
// Bar が出力される
Optional.ofNullable(null).or(() -> Optional.of("Bar")).ifPresent(System.out::println);

stream()

値が存在する場合は要素が1個のストリームを返す。
値が存在しない場合は要素が0個のストリームを返す。

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