1. ホーム
  2. java

[解決済み] JavaにおけるOptional orElse Optional

2022-05-11 02:29:47

質問

私は、新しい Java 8 のオプション型 という、機能的にサポートされていない一般的な操作のようなものに遭遇しました。

次のようなパターンを考えてみましょう。

Optional<Result> resultFromServiceA = serviceA(args);
if (resultFromServiceA.isPresent) return result;
else {
    Optional<Result> resultFromServiceB = serviceB(args);
    if (resultFromServiceB.isPresent) return resultFromServiceB;
    else return serviceC(args);
}

このパターンには多くの形式がありますが、要するに、現在のオプションが存在しない場合にのみ呼び出される新しいオプションを生成する関数を取るオプションに "orElse" が必要なのです。

実装はこんな感じでしょうか。

public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
    return value != null ? this : other.get();
}

このような方法が存在しない理由があるのか、私が意図しない方法でOptionalを使っているだけなのか、このケースに対処するために他の人はどんな方法を思いついたのか、気になるところです。

カスタムユーティリティクラス/メソッドを含む解決策は、エレガントではないと思います。

また、もしご存知の方がいらっしゃいましたら、そのようなメソッドはJDK9に搭載されるのでしょうか、またそのようなメソッドをどこに提案すればよいのでしょうか。私には、これはAPIにかなり目立った欠落があるように思えます。

解決方法は?

これは、JDK 9の一部で、形式的には or を取る。 Supplier<Optional<T>> . そうすると、あなたの例は次のようになります。

return serviceA(args)
    .or(() -> serviceB(args))
    .or(() -> serviceC(args));

詳細はこちらをご覧ください Javadoc または この記事 と書きました。