広告

Java : OptionalDouble - API使用例

OptionalDouble (Java SE 21 & JDK 21) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様書のおともにどうぞ。


概要

double値を含む場合と含まない場合があるコンテナオブジェクト。 値が存在する場合、isPresent()はtrueを返します。 値が存在しない場合、オブジェクトはemptyとみなされ、isPresent()はfalseを返します。

クラス構成

OptionalDouble クラスは、プリミティブ型double を扱う Optional です。

関連記事 : Optionalの基本

本記事のコード例では、以下の DoubleSample クラスを使います。

public class DoubleSample {

    private final double value;

    public DoubleSample() {
        this.value = -1.0;
    }

    public DoubleSample(double value) {
        if (value < 0.0) {
            throw new IllegalArgumentException();
        }

        this.value = value;
    }

    public OptionalDouble getValue() {
        if (value < 0.0) {
            return OptionalDouble.empty();
        } else {
            return OptionalDouble.of(value);
        }
    }
}
final var sample = new DoubleSample(1.23);

sample.getValue().ifPresent(value -> {
    System.out.println("value : " + value);
});

// 結果
// ↓
//value : 1.23
final var sample = new DoubleSample();

sample.getValue().ifPresentOrElse(value -> {
    System.out.println("value : " + value);
}, () -> {
    System.out.println("value : empty!");
});

// 結果
// ↓
//value : empty!

メソッド

static OptionalDouble empty ()

空のOptionalDoubleインスタンスを返します。

final var opt = OptionalDouble.empty();
System.out.println(opt); // OptionalDouble.empty
System.out.println(opt.isEmpty()); // true
final var opt = OptionalDouble.empty();

try {
    final var value = opt.orElseThrow();
} catch (NoSuchElementException e) {
    System.out.println(e);
}

// 結果
// ↓
//java.util.NoSuchElementException: No value present

boolean equals (Object obj)

他のオブジェクトがこのOptionalDoubleに"等しい"かどうかを示します。

final var opt1 = OptionalDouble.of(100.0);
final var opt2 = OptionalDouble.of(100.0);
final var opt3 = OptionalDouble.of(999.0);

System.out.println(opt1.equals(opt2)); // true
System.out.println(opt1.equals(opt3)); // false
final var opt1 = OptionalDouble.of(1.23);
final var opt2 = OptionalDouble.empty();

System.out.println(opt1.equals(opt2)); // false
final var opt1 = OptionalDouble.empty();
final var opt2 = OptionalDouble.empty();

System.out.println(opt1.equals(opt2)); // true

double getAsDouble ()

値がある場合は値を返し、そうでない場合はNoSuchElementExceptionをスローします。

final var sample = new DoubleSample(1.23);

final var opt = sample.getValue();
if (opt.isPresent()) {
    System.out.println(opt.getAsDouble()); // 1.23
}
final var sample = new DoubleSample();
final var opt = sample.getValue();

try {
    final var value = opt.getAsDouble();
} catch (NoSuchElementException e) {
    System.out.println(e);
}

// 結果
// ↓
//java.util.NoSuchElementException: No value present

int hashCode ()

存在する場合は値のハッシュ・コードを返し、値が存在しない場合は0 (zero)を返します。

final var ret1 = OptionalDouble.empty().hashCode();
System.out.println(ret1); // 0

final var ret2 = OptionalDouble.of(1.23).hashCode();
System.out.println(ret2); // 1158867386

final var ret3 = OptionalDouble.of(-0.789).hashCode();
System.out.println(ret3); // 1383618319

void ifPresent (DoubleConsumer action)

値が存在する場合は、その値で指定されたアクションを実行し、そうでない場合は何もしません。

final var sample = new DoubleSample(1.23);

System.out.println("-- ifPresent --");
sample.getValue().ifPresent(value -> {
    System.out.println("  action : " + value);
});

System.out.println("-- end --");

// 結果
// ↓
//-- ifPresent --
//  action : 1.23
//-- end --
final var sample = new DoubleSample();

System.out.println("-- ifPresent --");
sample.getValue().ifPresent(value -> {
    System.out.println("  action : " + value);
});

System.out.println("-- end --");

// 結果
// ↓
//-- ifPresent --
//-- end --

void ifPresentOrElse (DoubleConsumer action, Runnable emptyAction)

値が存在する場合は、指定されたアクションを値とともに実行し、そうでない場合は空のベースのアクションを実行します。

final var sample = new DoubleSample(1.23);

System.out.println("-- ifPresentOrElse --");
sample.getValue().ifPresentOrElse(value -> {
    System.out.println("  action : " + value);
}, () -> {
    System.out.println("  emptyAction!");
});

System.out.println("-- end --");

// 結果
// ↓
//-- ifPresentOrElse --
//  action : 1.23
//-- end --
final var sample = new DoubleSample();

System.out.println("-- ifPresentOrElse --");
sample.getValue().ifPresentOrElse(value -> {
    System.out.println("  action : " + value);
}, () -> {
    System.out.println("  emptyAction!");
});

System.out.println("-- end --");

// 結果
// ↓
//-- ifPresentOrElse --
//  emptyAction!
//-- end --

boolean isEmpty ()

値が存在しない場合はtrue、それ以外の場合falseを返します。

final var sample = new DoubleSample(1.23);

if (sample.getValue().isEmpty()) {
    System.out.println("empty!");
} else {
    System.out.println("present!");
}

// 結果
// ↓
//present!
final var sample = new DoubleSample();

if (sample.getValue().isEmpty()) {
    System.out.println("empty!");
} else {
    System.out.println("present!");
}

// 結果
// ↓
//empty!

boolean isPresent ()

値が存在する場合はtrueを返し、そうでない場合はfalseを返します。

final var sample = new DoubleSample(1.23);

if (sample.getValue().isPresent()) {
    System.out.println("present!");
} else {
    System.out.println("empty!");
}

// 結果
// ↓
//present!
final var sample = new DoubleSample();

if (sample.getValue().isPresent()) {
    System.out.println("present!");
} else {
    System.out.println("empty!");
}

// 結果
// ↓
//empty!

static OptionalDouble of (double value)

指定された値を記述するOptionalDoubleを返します。

final var opt1 = OptionalDouble.of(1.23);
System.out.println(opt1); // OptionalDouble[1.23]

final var opt2 = OptionalDouble.of(-0.789);
System.out.println(opt2); // OptionalDouble[-0.789]

double orElse (double other)

値が存在する場合は値を返し、そうでない場合はotherを返します。

final var sample = new DoubleSample(100.0);

final var ret = sample.getValue().orElse(9999.0);
System.out.println(ret); // 100.0
final var sample = new DoubleSample();

final var ret = sample.getValue().orElse(9999.0);
System.out.println(ret); // 9999.0

double orElseGet (DoubleSupplier supplier)

値が存在する場合は値を返し、そうでない場合は供給関数によって生成された結果を返します。

final var sample = new DoubleSample(100.0);

final var ret = sample.getValue().orElseGet(() -> {
    System.out.println("action!");
    return 9999.0;
});

System.out.println("ret = " + ret);

// 結果
// ↓
//ret = 100.0
final var sample = new DoubleSample();

final var ret = sample.getValue().orElseGet(() -> {
    System.out.println("action!");
    return 9999.0;
});

System.out.println("ret = " + ret);

// 結果
// ↓
//action!
//ret = 9999.0

double orElseThrow ()

値がある場合は値を返し、そうでない場合はNoSuchElementExceptionをスローします。

final var sample = new DoubleSample(1.23);

final var opt = sample.getValue();
if (opt.isPresent()) {
    System.out.println(opt.orElseThrow()); // 1.23
}
final var sample = new DoubleSample();
final var opt = sample.getValue();

try {
    final var value = opt.orElseThrow();
} catch (NoSuchElementException e) {
    System.out.println(e);
}

// 結果
// ↓
//java.util.NoSuchElementException: No value present

<X extends Throwable> double orElseThrow (Supplier<? extends X> exceptionSupplier)

値が存在する場合は値を返し、そうでない場合は例外を提供する関数によって生成された例外をスローします。

final var sample = new DoubleSample(1.23);

final var opt = sample.getValue();
if (opt.isPresent()) {
    final var value = opt.orElseThrow(IllegalStateException::new);
    System.out.println(value); // 1.23
}
final var sample = new DoubleSample();

try {
    final var value = sample.getValue().orElseThrow(() -> {
        throw new IllegalStateException("empty!");
    });
} catch (IllegalStateException e) {
    System.out.println(e);
}

// 結果
// ↓
//java.lang.IllegalStateException: empty!

DoubleStream stream ()

値が存在する場合は、その値のみを含む順次DoubleStreamを返し、それ以外の場合は空のDoubleStreamを返します。

final var sample = new DoubleSample(1.23);

final var array = sample.getValue().stream().toArray();
System.out.println(Arrays.toString(array)); // [1.23]

final var count = sample.getValue().stream().count();
System.out.println(count); // 1
final var sample = new DoubleSample();

final var array = sample.getValue().stream().toArray();
System.out.println(Arrays.toString(array)); // []

final var count = sample.getValue().stream().count();
System.out.println(count); // 0

String toString ()

デバッグに適したこのOptionalDoubleの空でない文字列表現を返します。

final var ret1 = OptionalDouble.empty().toString();
System.out.println(ret1); // OptionalDouble.empty

final var ret2 = OptionalDouble.of(1.23).toString();
System.out.println(ret2); // OptionalDouble[1.23]

final var ret3 = OptionalDouble.of(-0.789).toString();
System.out.println(ret3); // OptionalDouble[-0.789]

関連記事

ページの先頭へ