2016-05-03 13 views
2

Ich bin auf der Suche nach einer bequemeren Möglichkeit der Gleichheitsprüfung für einen optionalen Wert.Bequeme Art der Überprüfung der Gleichheit für Optionals

Dies ist, was ein Oracle Blog post schlägt vor:

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

IMHO Ergebnisse in so etwas wie

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

Natürlich, die Art eines schlechten Beispiel ist, weil es die Version und nicht die Instanz von USB vergleicht sich aber ich denke, es sollte noch meinen Standpunkt beweisen.

Ist das wirklich so gut wie es geht?

Kein

boolean presentAndEquals(Object) 

oder

boolean deepEquals(Object) 

Bin ich hier etwas fehlt?

EDIT:

ich mit Optionals.equals entweder nicht so glücklich bin. Muss ich wirklich ein Objekt zuerst boxen, um sofort zu entpacken und auf Gleichheit zu prüfen? direkt

+0

Nicht vorzeitig optimieren. Sie müssen entweder box (für die Sie die Kosten nicht kennen), oder testen Sie für 'isPresent()' (die Sie auch nicht die Kosten kennen). 'mayfoo.equals (Optional.of (...))' ist lesbar, also benutze es. – slim

+0

stimme ich über vorzeitige Optimierung, aber es ist mehr über Code Golf als Timing .. über Java sprechen richtig;) –

+1

"Ich bin nicht glücklich" Es gibt nichts besonderes über 'Optional': Es ist nur ein Container für eine Referenz. Würdest du erwarten, dass eine andere Klasse, die zufällig einen 'String' enthält, für 'new Frobnitz' ('some string') den Wert 'wahr' zurückgibt. Die Fälle, in denen die Kürze nützlich ist, werden durch die Fälle aufgewogen, in denen es einfach falsch ist. –

Antwort

10

Sie haben viele Möglichkeiten.

bereits erwähnt:

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

Alternativ:

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

Oder:

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

Die letzten beiden haben etwas andere Semantik haben: jeder gibt einen anderen Wert, wenn maybeFoo leer und testFoo ist null. Es ist nicht klar, welche die richtige Antwort ist (was vermutlich ein Grund ist, dass es keine Standard-API-Methode gibt, die dies tut).

Sie können sich wahrscheinlich mit anderen befassen, wenn Sie das API-Dokument Optional lesen und sich einige Gedanken machen. Es gibt nichts Magisches, das in den Dokumenten fehlt.

Allgemeiner, wenn Sie gegen das häufig genug stoßen, damit es Sie stört, nähern Sie sich möglicherweise Optional mit der falschen Philosophie.

Wie ich es sehe, ist Optional über die Anerkennung, dass etwas nicht immer vorhanden sein wird, und dass Sie (manchmal verbose) Code, um das zu handhaben benötigen.

Dies sollte die Ausnahme sein. Versuchen Sie nach Möglichkeit Variablen zu erstellen, die nicht null oder Optional.empty() sein können.

In Situationen, in denen dies unvermeidbar ist, sollten Sie die Tatsache berücksichtigen, dass Sie zusätzlichen Code benötigen.

+0

Nur die zweite Lösung passt zu der Frage - das OP möchte, dass der Test falsch ist, wenn keiner der Werte vorhanden ist. –

+0

Es ist nicht klar, dass OP darüber nachgedacht hat, was er in dieser Situation wirklich will. – slim

+0

Vielleicht, aber ich dachte, die Absicht wurde in der Wunschliste Liste Beispiel 'boolean presentAndEquals (Object)' –

6

Optional implementiert die equals Methode:

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

(auch Objects.equals statt equals Aufruf direkt verwenden können)

EDIT:

Wenn Sie beide nicht vorhanden, falsch zu sein, Sie können dies tun:

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

Das OP möchte, dass das Ergebnis falsch ist, wenn beide nicht vorhanden sind. –

+0

bearbeitet - Sie können einfach eine Extra-Klausel einfügen, um den Wert Präsenz zu prüfen – thecoop

+0

@HankD Der Wert zu vergleichen ist, nun, ein Wert. Also die Situation "beide sind nicht da." kommt einfach nicht vor. Zu Ihrem anderen Kommentar: 'presentAndEquals' bedeutet, dass ein Wert vorhanden ist und einem anderen Wert entspricht. – zeroflagL

Verwandte Themen