Moyen pratique de vérifier l'égalité pour les Options
Je suis à la recherche d'un moyen plus pratique de vérification linguistique de l'égalité, pour une valeur Facultative.
C'est ce qu'un Oracle post de Blog suggère:
Optional<USB> maybeUSB = ...; maybeUSB.filter(usb -> "3.0".equals(usb.getVersion())
.ifPresent(() -> System.out.println("ok"));
À mon humble avis se traduit par quelque chose comme
if (maybeUSB.filter(c -> "3.0".equals(c.getVersion())).isPresent()) {
...
}
Bien sûr que c'est un mauvais exemple car il compare la Version et de ne pas l'instance de l'USB elle-même, mais je pense qu'il devrait encore une preuve de mon point de.
Est-ce vraiment aussi bon qu'il obtient?
Pas
boolean presentAndEquals(Object)
ou
boolean deepEquals(Object)
Suis-je manqué quelque chose?
EDIT:
Je ne suis pas heureux avec Options.est égal à soit.
Dois-je vraiment zone un Objet tout d'abord instantanément unbox et vérifier l'égalité ?
Ne pas optimiser prématurément. Soit vous avez de la boîte (que vous ne connaissez pas le coût de l'), ou test pour
Je suis d'accord au sujet de l'optimisation prématurée, mais c'est plus sur le code de golf que le timing.. parler de Java, à droite 😉
"Je ne suis pas heureux" Il n'y a rien de spécial à propos de
La plus nette possible, de manière standard de vérification pour l'égalité, mais vous n'êtes pas heureux. Vous devriez peut-être passer à une autre langue.
Si vous regardez le code source de
isPresent()
(dont vous ne connaissez pas le coût de l'). maybeFoo.equals(Optional.of(...))
est lisible, afin de l'utiliser.Je suis d'accord au sujet de l'optimisation prématurée, mais c'est plus sur le code de golf que le timing.. parler de Java, à droite 😉
"Je ne suis pas heureux" Il n'y a rien de spécial à propos de
Optional
: c'est juste un conteneur pour une référence. Vous attendez-vous à une autre classe qui s'est passé pour contenir un String
retourner la valeur true pour new Frobnitz("some string").equals("some string")
? Le cas où la brièveté est utile sont compensés par les cas où il est tout simplement incorrecte.La plus nette possible, de manière standard de vérification pour l'égalité, mais vous n'êtes pas heureux. Vous devriez peut-être passer à une autre langue.
Si vous regardez le code source de
Optional
, c'est vraiment un tas de fonctions de confort qui ont l'air aussi laid. Si c'est quelque chose que vous faites souvent, n'hésitez pas à commencer votre propre name.ebner.franz.Optionals
et de faire le vilain s'en aller.OriginalL'auteur Franz Ebner | 2016-05-03
Vous devez vous connecter pour publier un commentaire.
Vous avez beaucoup d'options.
Déjà noté:
Sinon:
Ou:
Ces deux derniers n'ont légèrement différente de la sémantique: chaque retourne une valeur différente lorsque
maybeFoo
est vide ettestFoo
est null. Il n'est pas clair qui est la bonne réponse (qui je suppose est une raison pour laquelle il n'y a pas une API standard de la méthode qui fait cela).Vous pouvez probablement venir avec d'autres, si vous lisez le
Optional
doc API et appliquez de la pensée. Il n'y a rien de magique qui est absent de la documentation.Plus généralement, si vous êtes à frapper contre cette suffisamment souvent pour qu'il vous dérange, vous pourriez être en train d'approcher
Optional
avec la mauvaise philosophie.Comme je le vois,
Optional
est de reconnaître que quelque chose ne sera pas toujours présent, et que vous avez besoin (parfois en clair) code de gérer cela.Cela devrait être l'exception. Dans la mesure du possible, d'essayer de créer des variables qui ne peut pas être null ou
Optional.empty()
.Dans les situations où cela est inévitable, embrasser le fait que vous avez besoin de plus de code.
Il n'est pas clair que l'OP a pensé à ce qu'il veut vraiment dans cette situation.
Peut-être, mais je pensais que le but était clairement indiqué dans la liste de souhaits exemple
boolean presentAndEquals(Object)
Notez également que la valeur null et "pas de cadeau" ne sont pas nécessairement la même chose. Une autre partie du point de
Optional
est qu'elle fait de la présence et de l'absence explicite.null
signifie que vous le souhaitez.Le dernier, de ne pas renvoyer une valeur différente lorsque
testFoo
estnull
, il va lancer uneNullPointerException
, tout comme la première.OriginalL'auteur slim
Optional
met en œuvre laequals
méthode directement:(vous pouvez également utiliser
Objects.equals
plutôt que d'appelerequals
directement)EDIT:
Si vous souhaitez à la fois de ne pas présenter de faux, vous pouvez le faire:
édité, vous pouvez simplement le mettre dans un supplément de la clause de vérifier la valeur de la présence
La valeur de comparaison est, ainsi, une valeur. Donc, la situation "les deux ne sont pas présent." n'a tout simplement pas se produire. Quant à votre autre commentaire:
presentAndEquals
signifie qu'une valeur est présente et égale à une autre valeur.OriginalL'auteur thecoop
Serait-ce de travailler?
OriginalL'auteur Hai Phan