Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9のOptional.ifPresentOrElse()メソッドとOptional.or()メソッドの違いとは?

Java 9では、Optionalクラスの機能強化の一環として、ifPresentOrElse()メソッドとor()メソッドという2つの新しいメソッドが追加されました。どちらもOptionalの値の有無を扱うメソッドですが、目的も戻り値もまったく異なります。本記事では、それぞれの構文と具体的なコード例をもとに、両者の違いをわかりやすく解説します。

Optional.ifPresentOrElse()メソッドとは

Optional.ifPresentOrElse()メソッドは、値が存在する場合はその値を使って指定されたアクション(Consumer)を実行し、値が存在しない場合には代わりに「空の場合のアクション」(Runnable)を実行します。戻り値はvoidであるため、値の有無に応じた副作用のある処理(ログ出力やカウンタ更新など)に適しています。

構文

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

第1引数のConsumerには値が存在する場合の処理を、第2引数のRunnableには値が存在しない場合の処理を渡します。

コード例

import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;

public class IfPresentOrElseMethodTest {
    public static void main(String args[]) {
        optionalIsPresent();
        optionalIsEmpty();
    }
    private static void optionalIsPresent() {
        Optional<String> optional = Optional.of("Test");
        AtomicInteger successCounter = new AtomicInteger();
        AtomicInteger emptyOptionalsCounter = new AtomicInteger();

        optional.ifPresentOrElse(x -> successCounter.incrementAndGet(),
                () -> emptyOptionalsCounter.incrementAndGet());

        System.out.println(successCounter.get());
        System.out.println(emptyOptionalsCounter.get());
    }
    private static void optionalIsEmpty() {
        Optional optional = Optional.empty();
        AtomicInteger successCounter = new AtomicInteger();
        AtomicInteger emptyOptionalsCounter = new AtomicInteger();

        optional.ifPresentOrElse(x -> successCounter.incrementAndGet(),
                () -> emptyOptionalsCounter.incrementAndGet());

        System.out.println(successCounter.get());
        System.out.println(emptyOptionalsCounter.get());
    }
}

実行結果

1
0
0
1

最初のoptionalIsPresent()では値「Test」が存在するため、successCounterが1、emptyOptionalsCounterが0になります。一方、optionalIsEmpty()ではOptional.empty()によって値が存在しないため、結果が逆転して0と1が出力されます。

Optional.or()メソッドとは

Optional.or()メソッドは、値が存在する場合はその値を含むOptionalをそのまま返し、値が存在しない場合には引数のSupplierが生成する別のOptionalを返します。戻り値としてOptionalを返すため、メソッドチェーンで代替値を指定するのに便利です。

構文

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

コード例

import java.util.Optional;

public class OptionalOrMethodTest {
    public static void main(String args[]) {
        optionalIsPresent();
        optionalIsEmpty();
    }
    private static void optionalIsPresent() {
        Optional<String> optional1 = Optional.of("Test1");
        Optional<String> optional2 = Optional.of("Test2");

        Optional<String> optional3 = optional1.or(() -> optional2);
        System.out.println(optional3.get());
    }
    private static void optionalIsEmpty() {
        Optional<String> optional1 = Optional.empty();
        Optional<String> optional2 = Optional.of("Test2");

        Optional<String> optional3 = optional1.or(() -> optional2);
        System.out.println(optional3.get());
    }
}

実行結果

Test1
Test2

optional1に値が存在する場合はその値「Test1」がそのまま使われ、optional1が空の場合はSupplierが返すoptional2の値「Test2」が代わりに採用されます。

両メソッドの違いまとめ

比較項目ifPresentOrElse()or()
導入バージョンJava 9Java 9
戻り値void(なし)Optional<T>
引数ConsumerとRunnableの2つSupplierのみの1つ
主な用途値の有無に応じた処理の分岐空の場合の代替Optionalの提供

このように、ifPresentOrElse()は「値があるとき/ないとき」の両方の処理を一度に記述したい場合に、or()は「値がないときの代替値を簡潔に指定したい場合」にそれぞれ活用すると効果的です。

  1. Javaのwait()メソッドとsleep()メソッドの違いを徹底解説

    Javaのマルチスレッドプログラミングでは、sleep()メソッドとwait()メソッドのどちらもスレッドの処理を一時停止させるために使用されますが、両者にはいくつかの重要な違いがあります。本記事では、それぞれの特徴と相違点をわかりやすく解説します。 sleep()メソッドとwait()メソッドの主な違い 1. メソッドの種類と影響範囲 sleep()メソッドはThreadクラスのstatic(静的)メソッドであり、呼び出すと現在実行中のスレッドを「実行不可能(Non-Runnable)」状態にします。 一方、wait()メソッドはインスタンスメソッドであり、スレッドオブジェクトではなく対象の

  2. JavaのcompareTo()メソッドとcompare()メソッドの違いを徹底解説

    Javaでオブジェクトを並べ替える際に登場するのが、ComparableインターフェースのcompareTo()メソッドと、Comparatorインターフェースのcompare()メソッドです。名前はよく似ていますが、役割や使い方には明確な違いがあります。 Comparableインターフェースが提供するcompareTo()メソッドは、オブジェクトの順序付けを決めるためのもので、この順序は自然順序付け(natural ordering)、このメソッドは自然比較メソッドと呼ばれます。一方、Comparatorインターフェースが提供するcompare()メソッドはソート処理を実行するためのもので、