2015-11-25 21 views
10

GuavaからOptional Javaへの変換方法if文を一切使用せずにオプションで使用できますか?GuavaからJavaへのオプションの変換

if (maybeSomething.isPresent()) { 
    return java.util.Optional.of(maybeSomething.get()) 
} else { 
    return java.util.Optional.empty() 
} 
+2

詳しいコンテキスト情報が必要とされています。あなたのコードベースは、Guavaのオプションを広範囲に使用していますか?どのようにJava 8に置き換える予定ですか?どのようにグアバのオプションを現在使用していますか? Streamの.findAny()などの既存のインスタンスの使用が期待されますか?まずは移行戦略が必要です – fge

+0

ifステートメントではどうしますか?何か試しましたか? –

+0

APIの移行に関する一般的な問題はありません。このような変換が必要なケースは1つだけです。 – Libre13

答えて

17

使用グアバ変換

maybeSomething 
    .transform(java.util.Optional::of).or(java.util.Optional.empty()); 
+2

これと@ Kayamanのヌルベースのアプローチのどちらかを選択する明白な技術的理由がないのを見て、私はどちらか一方がパフォーマンスの優位性を示すかどうか不思議でした。いくつかの速いパフォーマンステストを行い、実行時間に大きな違いがないことを確認しました。さらに分析すると、ヌルベースのアプローチの場合、かなり多くのオブジェクトが割り当てられます(〜2倍)。だから、私はこの答えが間違いなく最も正しいと思います。 – JakeRobb

12

Optional javaOpt = Optional.ofNullable(guavaOpt.orNull());

+0

これはnullおよび逆に変換する必要がありますが、通常はオプションでヌルを使用します。 – MariuszS

+0

True、ただしnullに変換するまったく同じ最終結果を得るためのより短い方法を提供します。 – Kayaman

+1

@ MariuszSの答えに対する私のコメントを参照してください - このオプションは、より多くのオブジェクト割り当てを実行します。かなりの量のコールを処理している場合は、もう少し長くして(ユーティリティメソッドに入れて、もう一度それを見ないように)、別の答えはガベージコレクタの負担を軽減します。 – JakeRobb

1

は、それは完全にあなたが現在お使いのグアバのOptionalsで行うの用途に依存します。最初の問題は両方の違いにあります。中でも

  • グアバのオプションのが最終的なもので、Javaの8抽象的です。
  • Java上で動作しないGuava上にメソッドが存在し、その逆もあります。

最初にあなたが判断する必要があるのは、グアバのさまざまな使用方法です。これは同等のJava 8を構築する必要がある方法を調整します。

しかし、両方のためのAPIの違いを考えると、道に沿っていくつかのif sが避けられないようだ...ここ

私の個人的な提案は、ちょうどすべての道を行くとJava 8のとグアバのすべての現在の使用を置き換えることであろう; 「段階的期間」が必要な場合は、GuavaのOptionalが完全に除外されるまで、必要な方法を廃止し、必要に応じて提供してください。

+1

それは私がダウン投票した私ではありませんでしたが、本当に問題に対処するのではなく、利用可能な2つの「オプション」実装の賛否両論の素晴らしい概観を提供しています。 – Henrik

11

Guava Release 21はとfromJavaUtilの変換方法をOptionalクラスに導入しました。 Kayamanの答えで提案として主に実装されているように見えるフードの下

public java.util.Optional<T> toJavaUtil() { 
    return java.util.Optional.ofNullable(orNull()); 
} 

... 

public static <T> Optional<T> fromJavaUtil(@Nullable java.util.Optional<T> javaUtilOptional) { 
    return (javaUtilOptional == null) ? null : fromNullable(javaUtilOptional.orElse(null)); 
}