Guava のOptional
パターンは、null のあいまいさを取り除くのに役立つため、優れています。このtransform
メソッドは、チェーンの最初の部分が存在しない可能性がある場合に null セーフ メソッド チェーンを作成するのに非常に役立ちますが、チェーンの他の部分が存在しない場合は役に立ちません。
この質問は、変換が別の Optional を返すときに Guava Optional 型に関連しています。これは、本質的に同じ質問をしますが、意図された使用法ではない可能性がある別のユースケースについて質問しますOptional
(エラーの処理)。
方法を検討してくださいOptional<Book> findBook(String id)
。findBook(id).transform(Book.getName)
期待どおりに動作します。本が見つからない場合は を取得しAbsent<String>
、本が見つかった場合は を取得しPresent<String>
ます。
中間メソッドがnull
/を返す一般的なケースでabsent()
は、呼び出しを連鎖させる洗練された方法はないようです。たとえば、Book
にメソッドOptional<Publisher> getPublisher()
があり、ある本の出版社から出版されたすべての本を取得したいとします。自然な構文は のように見えますがfindBook(id).transform(Book.getPublisher).transform(Publisher.getPublishedBooks)
、transform(Publisher.getPublishedBooks)
呼び出しが実際にはOptional<Optional<Publisher>>
.
を返す関数を受け入れるtransform()
ようなメソッドを onに持つことはかなり合理的です。関数の結果をオプションでラップしないことを除いて、現在の実装とまったく同じように動作します。( の) 実装は次のようになります。Optional
Optional
Present
public abstract <V> Optional<V> optionalTransform(Function<? super T, Optional<V>> function) {
return function.apply(reference);
}
の実装Absent
は から変更されていませんtransform
:
public abstract <V> Optional<V> optionalTransform(Function<? super T, Optional<V>> function) {
checkNotNull(function);
return Optional.absent();
}
また、従来のオブジェクトを操作するのでnull
はなく、返されるメソッドを処理する方法があればいいのにと思います。Optional
このようなメソッドは似ていますが、単に関数の結果をtransform
呼び出します。Optional.fromNullable
Optional
他の誰かがこの煩わしさに遭遇し、適切な回避策 (独自のクラスを作成する必要はありません) を見つけたかどうかに興味があります。また、Guava チームからの連絡や、この問題に関連するディスカッションについて教えていただければ幸いです (検索しても見つかりませんでした)。