En option est une bonne chose, auriez-vous l'utiliser? | Programme de travail

Auteur | Bocong-Den

Zebian | yugao

Photo de couverture | RPSC télécharger à partir de l'Est IC

Produit | RPSC (ID: CSDNnews)

EDITORIAL

A partir d'une caractéristique très intéressante introduite en Java 8 est en option des cours. principal problème est en option l'exception de pointeur NULL infâme (PointerException) Cette exception ne veut pas dire, et certainement tous les programmeurs Java sont bien conscients de l'anomalie. En option est le chemin complet java.util.Optional, l'utiliser pour éviter un tel code paradigme si (obj! =) {}, La chaîne de style de programmation peut être utilisé. En outre Filtre optionnel fourni par la méthode peut déterminer si l'objet est qualifié, sera de retour dans les conditions sont remplies, la méthode de carte peut modifier les propriétés de l'objet avant de retourner l'objet.

utilité en option

Essentiellement, en option est une classe d'emballage contient une valeur facultative, ce qui signifie que les classes optionnelles peuvent contenir des objets peuvent également être vides. Nous voulons savoir, la mise en uvre Java en option de la programmation fonctionnelle est une étape forte et les aider à paradigme. Mais la signification en option évidemment plus que cela. Nous savons que tout appel de méthode d'objet d'accès ou la propriété peut entraîner PointerException, ici je donne un exemple simple pour illustrer

1String résultat = test.getName.getTime.getNum.getAnswer;

Dans le code ci-dessus, si nous devons nous assurer de ne pas déclencher une exception, vous devez vérifier explicitement chaque valeur avant d'y accéder est d'utiliser si d'autre pour juger si l'équivalent de test, il est très facile de devenir longue , il est difficile de maintenir. Pour simplifier ce processus, projet Goyave renommée de Google introduit des cours en option, goyave pour éviter la contamination en utilisant le contrôle de code pour les valeurs nulles de la manière, et encourager les programmeurs à écrire du code plus propre. En option contenant en fait: il peut contenir la valeur de type T, ou tout simplement pour sauver. offre en option de nombreuses applications utiles, donc nous ne détection soient pas explicitement nulle.

constructeur en option

Trois configurations de voies en option: Optional.of (obj), Optional.ofable (obj) et Optional.empty clair

  • Optional.of (obj): Il faut obj entrant est pas une valeur, exception PointerException par ailleurs rapporté directement.

  • Optional.ofable (obj): Il est d'une manière intelligente, tolérante à la construction d'un exemple en option. Générosité, passer pour entrer dans le Optional.empty, non Invoqué Optional.of (obj).

  • Optional.empty: retourne un objet vide en option

Fonctions optionnelles couramment utilisées

  • de: la valeur créée par un non facultatif. méthodes optionnelles de création de classe par la méthode de l'usine. Notez que lorsque vous créez un objet passé comme paramètre ne peut pas. Si le paramètre est passé, jeter PointerException. Ils ne sont pas souvent utilisés.

  • ofable: en option pour créer une valeur spécifiée si la valeur spécifiée, un vide en option est retourné.

  • IsPresent: Renvoie true si la valeur existe, sinon faux.

  • IfPresent: par exemple en option s'il y a une valeur pour son appel consommateur, ou non traitée

  • obtenir: en option il y a la valeur sera retourné, sinon jeter NoSuchElementException. Donc, je ne l'utilise pas souvent.

  • OrElse: Si la valeur sera retourné, sinon toute autre valeur spécifiée.

  • orElseGet: méthode orElseGet et OrElse similaires, sauf que la valeur par défaut est obtenue. La méthode OrElse chaîne entrant comme la valeur par défaut, orElseGet interfaces fournisseurs procédé mis en oeuvre peut accepter des valeurs par défaut utilisé pour générer

  • orElseThrow: Si la valeur sera retourné, sinon une exception est levée interfaces fournisseur créées.

  • Filtre: En cas de valeur et répondre aux conditions de retour affirmation facultative contenant la valeur, sinon retour à vide en option.

  • carte: S'il y a valeur, alors la fonction de mappage appelant pour obtenir sa valeur de retour. Si la valeur de retour n'est pas, créez en option comprennent la cartographie de la valeur de retour comme la méthode carte renvoie une valeur, sinon revenir à vide en option.

  • flatMap: S'il y a une valeur, la fonction retourne pour son type de mappage de mise en uvre valeur de retour en option, sinon retour à vide en option.

En option devrait être comment utiliser

Lorsque vous utilisez le besoin en option d'envisager un certain nombre de choses à décider comment et quand l'utiliser. point important en option n'est pas Serializable. Par conséquent, il ne doit pas être utilisé comme un type de champ. Si vous avez besoin d'objets de sérialisation contiennent des valeurs optionnelles, bibliothèque Jackson soutient l'option comme des objets ordinaires. En d'autres termes, Jackson serait considéré comme un objet vide, et ont mis la valeur de l'objet dont la valeur est considérée comme une valeur correspondant au domaine. Cette fonction projet jackson-modules java8. En option est principalement utilisé comme un type de retour, après avoir obtenu une instance de ce type, si elle a une valeur, vous pouvez obtenir cette valeur, sinon il peut être un comportement alternatif. classe optionnelle peut être combiné avec d'autres méthodes ou flux retour en option pour construire API lisse. Nous regardons un exemple, nous n'utilisons pas de code d'écriture en option comme ceci:

1public Chaîne getName (utilisateur de l'utilisateur) { 2 if (utilisateur ==) { 3 retour « inconnu »; 4} else user.name de retour; 5}

Ensuite, nous regardons le code ci-dessus pour transformer, pour transformer l'utilisation de En option, nous allons donner un abus facultatif, n'a pas atteint l'API de la chaîne lisse, mais par exemple complexe, comme suit:

1public Chaîne getName (utilisateur de l'utilisateur) { 2 en option < utilisateur >  u = Optional.ofable (utilisateur); 3 if (! U.isPresent) { 4 return "inconnu"; 5} else u.get.name de retour; 6}

Une telle réécriture non seulement pas simple, mais il fonctionne toujours et le premier morceau de code même. rien IsPresent plus d'une façon de remplacer l'utilisateur initial ==. Ce n'est pas en option récrire l'utilisation correcte, nous réécrivons encore une fois.

1public Chaîne getName (utilisateur de l'utilisateur) { 2 Optional.ofable retour (utilisateur) 3 .map (u - >  u.name) 4 .orElse ( "inconnu"); 5}

Ceci est l'utilisation correcte de la posture en option. Eh bien, selon cette ligne de pensée, nous pouvons sans risque être appels enchaînés, plutôt que des couches de jugement. Bien sûr, nous pouvons réduire encore le code (à condition que l'utilisateur ont méthode de lecture oh) par getter, comme suit

résultat 1String = Optional.ofable (utilisateur) 2 .flatMap (User :: getAddress) 3 .flatMap (Adresse :: getCountry) 4 .map (Pays :: getIsocode) 5 .orElse ( "default");

Meilleures pratiques en option

Tout d'abord, laissez sur une carte, utiliser l'occasion de brièvement en option:

  • Évitez d'utiliser instance Optional.isPresent pour vérifier s'il y a (mentionné dans l'exemple ci-dessus), car de cette façon et! = Obj pas de différence, donc avec aucun sens.

  • Évitez d'utiliser manière Optional.get pour obtenir l'instance de l'objet, en raison de la nécessité d'utiliser Optional.isPresent avant de l'utiliser pour vérifier s'il y a des cas, il y aurait des anomalies NoSuchElementException. Il faut donc utiliser OrElse, orElseGet, orElseThrow obtenir vos résultats

Ici pour expliquer est OrElse (...) est un moyen de calcul désireux similaire au code ci-dessous:

1En option < chien >  optionalDog = fetchOptionalDog; 2optionalDog 3 .map (ce :: printUserAndReturnUser) 4 .orElse (ce :: printVoidAndReturnUser)

Si les deux méthodes seront exécutées valeur existe, si la valeur n'existe pas, faire la dernière méthode ne. Pour traiter ces cas, on peut utiliser la méthode orElseGet, il le fournisseur en tant que paramètre et inerte calculé.

  • éviter en option en utilisant comme attributs de classe ou d'instance, mais doit être utilisé dans la valeur de retour retourné objet d'instance de package.

  • En option éviter l'utilisation de la méthode en tant que paramètre, les trois mêmes raisons.

  • Ne pas attribuer en option

  • Seulement à chaque fois que des résultats peu concluants, utilisez en option comme le type de retour, dans un sens, c'est le seul bon endroit pour utiliser le option avec java mots officiels, il est: Notre objectif est la bibliothèque de fournir le type de retour d'une méthode un mécanisme limité, ce qui exige une façon claire d'exprimer « aucun résultat », et une telle approche pourrait conduire à l'utilisation d'une erreur absolue.

  • Ne pas avoir peur de carte d'utilisation et le filtre, il y en a la peine de suivre la pratique générale de développement connu sous le nom SLA-p: simple couche d'abstraction première lettres majuscules. Ce qui suit est les besoins de code à reconstituer en un code reconstitué

Des exemples d'une

 1Dog chien = fetchSomeVaraible; 2String dogString = dogToString (chien); 3public Chaîne dogToString (chien chien) { 4 si (chien ==) { 5 return "nom DOG'd est:" + dog.getName; 6} else { 7 retour "CAT"; 8} 9} 10 // Code ci-dessous pour refactoring ci-dessus 11Optional < chien >  chien = fetchDogIfExists; 12String dogsName = chien 13 .map (ce :: convertToDog) 14 .orElseGet (ce :: convertToCat) 15 convertToDog 16public vide (chien chien) { 17 retour "nom DOG'd est:" + dog.getName; 18} 19 convertToCat 20Public void { 21 retour "CAT"; 22}

exemple Deux

1Dog chien = FetchDog; 2Si (optionalDog! = && optionalDog.isBigDog) { 3 doBlaBlaBla (optionalDog); 4} 5 // Code ci-dessous pour refactoring ci-dessus 6Optional < chien >  optionalDog = fetchOptionalDog; 7optionalDog 8 .filter (Dog :: isBigDog) 9 .ifPresent (ce :: doBlaBlaBla)
  • Non à la méthode de la chaîne en utilisant en option. Une chose à noter lors de l'utilisation de l'approche facultative de la chaîne de la tentation. Lorsque nous aimons le même lien constructeur méthode de mode, les choses peuvent sembler très joli. Mais il ne correspond pas toujours plus lisible. Donc, ne pas le faire, il a une performance négative, la lisibilité est pas bon. Nous devrions éviter autant que possible les références.

1Dog chien = FetchDog; 2Si (optionalDog! = && optionalDog.isBigDog) { 3 doBlaBlaBla (optionalDog); 4} 5 // Code ci-dessous pour refactoring ci-dessus 6Optional < chien >  optionalDog = fetchOptionalDog; 7optionalDog 8 .filter (Dog :: isBigDog) 9 .ifPresent (ce :: doBlaBlaBla)
  • Toutes les expressions deviennent lambda unique en ligne. Ceci est une règle plus générale, je pense qu'il devrait également être appliquée à l'écoulement. Mais cet article est optionnel. Utilisez point important en option à retenir est aussi important que le côté droit et gauche de l'équation, ici par exemple

 1En option 2 .ofable (somevariable) de 3 (la variable - >  { 4 try { 5 someREpozitory.findById retour (variable.getIdOfOtherObject); 6} catch (IOException e) { 7 LOGGER.error (e); 8 throw new RuntimeException (e); 9}}) 10 .filter (variable - >  { 11 si (variable.getSomeField1! =) { 12 return true; 13} else if (variable.getSomeField2! =) { 14 return false; 15} else { 16 return true; 17} 18}) 19 .map ((variable - >  { 20 try { 21 jsonMapper.toJson retour (variable); 22} catch (IOException e) { 23 LOGGER.error (e); 24 throw new RuntimeException (e); 25}})) 26 .map (String :: garniture) 27 .orElseThrow (- >  nouvelle RuntimeException ( « quelque chose a horriblement mal tourné. »))

Tant bloc de code ci-dessus d'autres méthodes peuvent être utilisées:

1En option 2 .ofable (somevariable) 3 .map (ce :: findOtherObject) 4 .filter (ce :: isThisOtherObjectStale) 5 .map (ce :: convertToJson) 6 .map (String :: garniture) 7 .orElseThrow (- >  nouvelle RuntimeException ( "quelque chose a terriblement mal."));

Lien original:

https://blog.csdn.net/DBC_121/article/details/104984093

RPSC carte de membre VIP nouveau intérêt pour elle! ! !

Des centaines de e-book est maintenant libre de le lire! Télécharger les ressources de la station, libre de regarder un millier de cours. apprentissage par jour seulement 0,8 yuans.

Tout indice de performance hors limites ou la cause de l'effondrement de l'APP, le test Youku de performance générale pour obtenir un mouvement
Précédent
équipe de recherche AI du cadre de Tsinghua « mètre carte » PK Pytorch, qui est supérieure? | Fin du bien-être
Prochain
Les programmeurs sont en train de disparaître
L'opération de Python: sept types de conditions de déclaration écrite
L'entretien est terminé ! Collection de questions d'entretien sur chenilles 2020
algorithme de modèle de langage naturel trop désordonné? cadre unifié national à l'IA open source
5 jours saisis 12! Le trafic soleil police enquête approfondie « bombardant la rue » sur les infractions routières
Taian: City School District organes de la CCPPC Daiyue deux groupes favorisant fortement les « quatre » travail critique
revitalisation province des équipes des écoles rurales: les plus belles empreintes laissées dans Rushan
Hong Kong Bâle vous invite à « cargaison balayage nuage » mode de transaction en ligne ou bienvenue « printemps »?
dommages génie municipal de Shenzhen en raison d'une route non réparé depuis plusieurs mois, l'unité de construction d'enquête du département
baisse des taux devrait baisser, la dernière LPR a annoncé! hypothèques de prix de transfert LPR augmentation mensuelle ou diminution?
Namebase donner de l'argent aux développeurs GitHub blanc, ou tirer nouvelle escroquerie à l'investissement?
Comment les ingénieurs ne gèrent la transition de la technologie?