2016-05-03 14 views
2

私はオプション値の平等を証明するより便利な方法を探しています。オプションの平等をチェックする便利な方法

これはOracle Blog postが示唆するものである:貧困層の例のようなものだ。もちろん、

if (maybeUSB.filter(c -> "3.0".equals(c.getVersion())).isPresent()) { 
    ... 
} 

のようなもので

Optional<USB> maybeUSB = ...; maybeUSB.filter(usb -> "3.0".equals(usb.getVersion()) 
        .ifPresent(() -> System.out.println("ok")); 

IMHO結果を、それは、USB自体のインスタンスをバージョンを比較していないので、しかし私はそれがまだ私のポイントを証明するべきだと思います。

これは本当に良いですか?

boolean presentAndEquals(Object) 

または

boolean deepEquals(Object) 

私はここで何かが足りないのですか?

EDIT:

私はどちらかOptionals.equalsとその満足していません。 まず、オブジェクトをボックスに入れてすぐにunboxし、等価性をチェックする必要がありますか?あなたが偽であるために存在し、両方でない場合は、

if (maybeUSB.equals(Optional.ofNullable(testUSB))) { 
    ... 
} 

(あなたも、むしろ直接equalsを呼び出すよりもObjects.equalsを使用することができます)

EDIT:

+0

時期尚早に最適化しないでください。あなたはボックスを持っていなければなりません(コストを知らない)か、isPresent()のテストをしなければなりません。 'maybeFoo.equals(Optional.of(...))'は読み込み可能ですので、それを使用してください。 – slim

+0

私は時期尚早な最適化について同意しますが、タイミングよりもゴルフの方がJavaの権利について話しています。 –

+1

「私は満足していません」「オプション」について特別なことは何もない。 'new Frobnitz(" some string ")。equals(" some string ")'のためにtrueを返す 'String'を含む別のクラスがあると思いますか?簡潔さが有用な場合は、それがまったく間違っている場合よりも重要です。 –

答えて

10

多くのオプションがあります。

は、すでに述べた:

boolean isEqual = maybeFoo.equals(Optional.of(testFoo)); 

代わり:

boolean isEqual = maybeFoo.isPresent() && maybeFoo.get().equals(testFoo); 

または:

boolean isEqual = testFoo.equals(maybeFoo.orElse(null)); 

最後の2つは若干異なる意味を持っています。それぞれが異なる値を返すmaybeFooが空になったときにtestFooはnullです。正しい回答であるかどうかは明らかではありません(これは、標準のAPIメソッドがない理由の1つです)。

Optional APIのドキュメントを読んで考えてみるとおそらく他に出てくる可能性があります。ドキュメントに欠けている魔法はありません。

もっと一般的には、あなたに迷惑をかけるほど頻繁にこれをノックすると、間違った考え方でOptionalに近づいている可能性があります。

私が見ているように、Optionalは、何かが常に存在するとは限りませんし、それを処理するために(時には冗長な)コードが必要であることを認めています。

これは例外です。可能であれば、が無効、またはOptional.empty()がない変数を作成してください。

これが避けられない状況では、余分なコードが必要であるという事実を抱いてください。

+0

2番目の解決策のみが問題に合っています。OPはどちらの値もない場合、テストが偽であることを望みます。 –

+0

OPは、彼がその状況で本当に望んでいることを考えているのは明らかではありません。 – slim

+0

多分、私は意図がウィッシュリストの例で明らかになったと思いました。 'boolean presentAndEquals(Object)' –

6

Optionalは直接equalsメソッドを実装しますあなたはこれを行うことができます:

if (maybeUSB.equals(Optional.ofNullable(testUSB)) && maybeUSB.isPresent()) { 
    ... 
} 
+0

OPは両方が存在しない場合、結果が偽であることを望む。 –

+0

編集 - 値の存在を確認するために余分な句を入れることができます – thecoop

+0

@HankD比較する値は、まあ値です。だから状況は "どちらも存在しない"。単に起こらない。あなたの他のコメントについては、 'presentAndEquals'は値が存在し、別の値と等しいことを意味します。 – zeroflagL

関連する問題