私は新しいJava 8 のオプション型、そして機能的にサポートされていない一般的な操作と思われるものに遭遇しました: "orElseOptional"
次のパターンを考えてみましょう。
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 を意図しない方法で使用しているだけなのか、また、このケースに対処するために人々が考え出した他の方法は何か、興味があります。
カスタム ユーティリティ クラス/メソッドを含むソリューションは、私のコードで作業する人が必ずしもその存在を知るとは限らないため、エレガントではないと思います。
また、もしご存知の方がいらっしゃいましたら、そのようなメソッドは JDK 9 に含まれるのでしょうか、またそのようなメソッドをどこで提案すればよいのでしょうか。これは、私にとっては API のかなり明白な欠落のように思えます。
ベストアンサー1
or
これは、 を受け取るメソッド の形式で JDK 9 の一部ですSupplier<Optional<T>>
。例は次のようになります。
return serviceA(args)
.or(() -> serviceB(args))
.or(() -> serviceC(args));
詳細についてはJavadoc の、この郵便受け私は書いた、またはチケットJDK-8080418この方法が導入された場所です。