Java 9のOptionalクラス新機能:stream()、ifPresentOrElse()、or()
OptionalクラスはJava 8で導入され、nullチェックとNullPointerException問題を回避するためのものです。Java 9では機能向上のため3つの新メソッドが追加されました。
stream()ifPresentOrElse()or()
stream()メソッド
構文
public Stream<T> stream()
値が存在する場合はその値のみを含む順次ストリームを、存在しない場合は空ストリームを返します。
例
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Tester {
public static void main(String[] args) {
List<Optional<String>> list = Arrays.asList(
Optional.empty(), Optional.of("A"), Optional.empty(), Optional.of("B"));
// 従来の方法:flatMapでフィルタリング
List<String> filteredList = list.stream()
.flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
.collect(Collectors.toList());
// Java 9: Optional::streamを使用
List<String> filteredListJava9 = list.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
System.out.println(filteredList); // [A, B]
System.out.println(filteredListJava9); // [A, B]
}
}
ifPresentOrElse()メソッド
構文
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
値が存在する場合は指定されたアクションを値で実行、存在しない場合は指定された空アクションを実行します。
例
import java.util.Optional;
public class Tester {
public static void main(String[] args) {
Optional<Integer> optional = Optional.of(1);
optional.ifPresentOrElse(
x -> System.out.println("Value: " + x),
() -> System.out.println("Not Present."));
optional = Optional.empty();
optional.ifPresentOrElse(
x -> System.out.println("Value: " + x),
() -> System.out.println("Not Present."));
}
}
出力
Value: 1 Not Present.
or()メソッド
構文
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
値が存在する場合はその値を記述するOptionalを返し、存在しない場合は供給関数で生成されたOptionalを返します。
例
import java.util.Optional;
import java.util.function.Supplier;
public class Tester {
public static void main(String[] args) {
Optional<String> optional1 = Optional.of("Mahesh");
Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present");
optional1 = optional1.or(supplierString);
optional1.ifPresent(x -> System.out.println("Value: " + x));
optional1 = Optional.empty();
optional1 = optional1.or(supplierString);
optional1.ifPresent(x -> System.out.println("Value: " + x));
}
}
出力
Value: Mahesh Value: Not Present
Java
- Javaのfinalキーワード完全解説:変数、メソッド、クラスでの活用法
- Java instanceof演算子完全ガイド:基本から継承・インターフェースまで
- Java Staticネストクラスの理解:用法、違い、実例
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Javaリフレクション完全ガイド:実行時のクラス・メソッド・フィールド検査
- Java ObjectOutputStream完全ガイド:シリアル化、メソッド、実践例
- Javaジェネリクス完全ガイド:再利用可能で型安全なコードの構築
- Javaファイル操作のマスター:java.ioによる作成・読み取り・書き込み・削除
- Java 9ストリームAPI拡張:takeWhile、dropWhile、iterate、ofNullable
- Java 8 Optional完全ガイド:実践的なNull安全コードの書き方