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é?
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.
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()) {
...
}
Cela fonctionnerait-il?
if (maybeUSB.map(c -> c.getVersion().equals("3.0")).orElse(false))