5
votes

Validation des entrées à l'aide de facultatif

J'ai une instance CreateOrder qui contient des états String, Integer et Double. Lorsque je crée un objet pour CreateOrder dans mon test JUnit et que je l'envoie, je peux valider les attributs String mais pas Integer à l'aide de l'API facultative comme suit -

String aoid = Optional.ofNullable(createOrder.getAltorderid()).orElse("");

int quantity = Integer.parseInt(each.getQty());
double amount = Double.parseDouble(each.getPrice().getAmount());

Comme pour aoid , je veux également utiliser ofNullable () pour un entier mais je ne suis pas en mesure de comprendre comment. Mon intention derrière cela est de sécuriser mon code contre NullPointerExceptions et par conséquent je veux rendre l'utilisateur puissant facultatif pour Integer et Double . Je suis assez nouveau dans Java 8 et je ne comprends pas si je dois utiliser OptionalInt ou Optional ? Si Optional , comment l'utiliser comme je l'ai utilisé pour String?


0 commentaires

3 Réponses :


2
votes
double amount = Optional.ofNullable(each.getPrice().getAmount())
        .map(Double::parseDouble)
        .orElse(Double.NaN);

4 commentaires

si l'entrée n'est pas invalide, cela génère une NumberFormatException


@AniruddhaTekade qu'attendez-vous dans de tels cas? Il devrait idéalement être jeté.


Je souhaite définir les valeurs par défaut si une exception se produit. Les méthodes getter sont implémentées par quelqu'un d'autre et le code est référencé par Gradle comme des dépendances. Puisque je ne peux pas changer ces méthodes, je veux m'assurer que si je reçois une entrée invalide, mon code définira par défaut 0 / 0.0 / "" pour les types int / double / string.


@AniruddhaTekade Eh bien, veuillez éditer la question dans ce cas, puisque la question a explicitement ajouté l'exigence de rendre l'instruction null sûre et le code actuel ne gère pas non plus l'exception. De plus, bien que la gestion des exceptions dans les flux / API optionnelles soit possible, c'est beaucoup plus chaotique à mon avis qu'une simple approche itérative.



1
votes

Essayez ceci

Optional.ofNullable(each.getQty()).map(Integer::valueOf).orElse(0)


3 commentaires

Si mon code reçoit une entrée non valide, l'exception sera-t-elle levée ici?


Ce n'est pas élégant .map (s -> {try {return Integer.valueOf (s);} catch (Exception e) {return 0;}}) ...


catch (Exception e) {return null; } aurait plus de sens que catch (Exception e) {return 0; } , car vous voulez que l'option optionnelle devienne absente dans ce cas.



0
votes

Tout d'abord, je pense que vous ne comprenez pas le but de Facultatif .

Le point principal de Facultatif est de fournir un moyen pour une fonction renvoyant une valeur d'indiquer l'absence de valeur de retour . Voir cette discussion . Cela permet à l'appelant de continuer une chaîne d'appels de méthode fluides.

Stuart Marks , développeur Java et OpenJDK

Donc, pour utiliser correctement l ' API facultative , vous devez repenser votre code. En supposant que votre chaque a un aoid nullable, votre méthode .getAltOrderId () doit être implémentée comme ceci:

int quantity = each.getQty()
                   .map(Integer::valueOf)
                   .orElse(0);


0 commentaires