web-dev-qa-db-fra.com

Moyen pratique de vérifier l'égalité pour les optionnels

Je cherche un moyen plus pratique de prouver l'égalité pour une valeur facultative.

Voici ce que/un Oracle Blog post suggère:

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

IMHO résultats dans quelque chose comme

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

Bien sûr, c'est un peu un exemple car il compare la version et non l'instance de l'USB mais je pense que cela devrait quand même prouver ce que je veux dire.

Est-ce vraiment aussi bon que cela?

Non

boolean presentAndEquals(Object)

ou

boolean deepEquals(Object)

Est-ce que j'ai râté quelque chose?

EDIT:

Je ne suis pas très heureux avec Optionals.equals non plus. Dois-je vraiment encercler un objet en premier pour décompresser instantanément et vérifier son égalité?

7
Franz Ebner

Vous avez beaucoup d'options.

Déjà noté:

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

Alternativement:

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

Ou:

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

Ces deux derniers ont une sémantique légèrement différente: chacun renvoie une valeur différente lorsque maybeFoo est vide et testFoo est nul. Il n'est pas clair quelle est la réponse correcte (ce qui est l'une des raisons pour lesquelles il n'existe pas de méthode API standard).

Vous pouvez probablement en trouver d'autres si vous lisez le document API Optional et appliquez un peu de réflexion. Il n'y a rien de magique qui soit absent de la documentation.

Plus généralement, si vous vous heurtez à cela assez souvent pour que cela vous dérange, vous pouvez vous approcher de Optional avec la mauvaise philosophie.

À mon avis, Optional consiste à reconnaître que quelque chose ne sera pas toujours présent et que vous avez besoin d'un code (parfois verbeux) pour gérer cela.

Cela devrait être l'exception. Dans la mesure du possible, essayez de créer des variables que ne peut pas être nul ou Optional.empty()

Dans les cas où cela est inévitable, tenez compte du fait que vous avez besoin de code supplémentaire.

14
slim

Optional implémente directement la méthode equals:

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

(vous pouvez également utiliser Objects.equals plutôt que d'appeler directement equals)

MODIFIER:

Si vous voulez que les deux non-présents soient faux, vous pouvez le faire:

if (maybeUSB.equals(Optional.ofNullable(testUSB)) && maybeUSB.isPresent()) {
    ...
}
6
thecoop

Cela fonctionnerait-il?

if (maybeUSB.map(c -> c.getVersion().equals("3.0")).orElse(false))
0
Hai Phan