Auteur | roi silencieux
Source | Blog RPSC
Figure Head | téléchargement payant de la Chine visuelle
Exposition | RPSC (ID: CSDNnews)
Voulez-vous apprendre, jamais trop tard, surtout pour Java 8 à l'intérieur d'une bonne chose, en option est l'un d'entre eux, qui fournit une solution pour représenter le niveau de la classe valeur facultative plutôt qu'une référence nulle. En tant que programmeur Java, j'étais NullPointerException vraiment fatigué (NPE), et bien qu'il soit cuit comme un vieil ami, sachez qu'il est forcé - le programme utilise un objet qu'ils ont trouvé cet objet est nul , de sorte que la machine virtuelle Java à poils pour le jeter comme un bouc émissaire.
Bien sûr, nous sommes pleins de programmeurs responsables, nous ne serons pas rester les bras croisés, alors il y aura un grand nombre de contrôles de valeur nulle. Bien que dans certains cas, cet examen n'a pas été nécessaire, mais nous sommes habitués à la routine. Enfin, Java 8 ne pouvait pas supporter, sur l'introduction de l'option, de sorte que notre code ne l'est plus terne moyenne.
En option n'a pas de problèmes
Nous devons simuler un scénario d'application pratique. Wang premier jour au travail, conduisant le cheval lui a donné une tâche à organiser, en lui demandant de prendre le nom d'un membre de la base de données en fonction de tirer le numéro de membre, les noms imprimés sur la console. Bien qu'il soit nouveau, mais la tâche a battu Wang, il a passé 10 minutes pour écrire ce code:
1public class WithoutOptionalDemo {
2 class Member {
3 private String name;
4
5 public String getName() {
6 return name;
7 }
8
9 public void setName(String name) {
10 this.name = name;
11 }
12 }
13
14 public static void main(String[] args) {
15 Member mem = getMemberByIdFromDB();
16 if (mem != null) {
17 System.out.println(mem.getName());
18 }
19 }
20
21 public static Member getMemberByIdFromDB() {
22 // 当前 ID 的会员不存在
23 return null;
24 }
25}
En raison de l'ID de membre actuel n'existe pas, donc getMemberByIdFromDB () méthode retourne une valeur nulle à la suite n'a pas obtenu le député, cela signifie que la première phrase de mem vide au moment de l'impression des noms des membres, sinon il lancera une exception NPE , ne croyez pas? Wang faire si (mem! = Null) essayer de supprimer la console imprimer immédiatement la pile d'erreur pour vous donner un peu de couleur pour voir.
1Exception in thread "main" java.lang.NullPointerException
2 at com.cmower.dzone.optional.WithoutOptionalDemo.main(WithoutOptionalDemo.java:24)
Comment résoudre ce problème est en option
Après Wang soumettre le code, puis aller joyeusement cheval à une nouvelle tâche. Dans l'attitude de l'apprentissage, look cheval Wang demander votre code d'ouverture d'esprit, le Pharaon lui a dit qu'il devrait essayer en option, afin d'éviter les contrôles de valeur null inutiles. Maintenant, le regard let à Wang est de savoir comment résoudre le problème par l'option.
1public class OptionalDemo {
2 public static void main(String[] args) {
3 Optional<Member> optional = getMemberByIdFromDB();
4 optional.ifPresent(mem -> {
5 System.out.println("会员姓名是:" + mem.getName());
6 });
7 }
8
9 public static Optional<Member> getMemberByIdFromDB() {
10 boolean hasName = true;
11 if (hasName) {
12 return Optional.of(new Member("沉默王二"));
13 }
14 return Optional.empty();
15 }
16}
17class Member {
18 private String name;
19
20 public String getName() {
21 return name;
22 }
23
24 // getter / setter
25}
méthode retourne getMemberByIdFromDB () en option <Membre> En conséquence, il indique membres peut exister ou ne peut pas exister, cette fois-ci peuvent être utilisés dans les expressions IfPresent en option Lambda () pour imprimer les résultats directement.
raison en option peut résoudre le problème de NPE, car il nous dit clairement qu'il n'a pas besoin d'être condamné vide. Il est comme le carrefour de la signalisation routière vous dire clairement où aller.
Création d'objets en option
1) Vous pouvez utiliser la méthode statique vide () crée un objet vide est en option
1Optional<String> empty = Optional.empty();
2System.out.println(empty); // 输出:Optional.empty
2) Utilisez la méthode statique () pour créer un objet en option non vides
1Optional<String> opt = Optional.of("沉默王二");
2System.out.println(opt); // 输出:Optional[沉默王二]
Bien sûr, des paramètres passés à la méthode () doit être vide, qui ne peut être nulle, sinon il jette encore NullPointerException.
1String name = null;
2Optional<String> optnull = Optional.of(name);
3) Avec la méthode statique ofNullable () pour créer un espace de non-vide, mais aussi un objet de la facultatif
1String name = null;
2Optional<String> optOrNull = Optional.ofNullable(name);
3System.out.println(optOrNull); // 输出:Optional.empty
Méthode ofNullable interne () a une triple expression, si le paramètre est nul, revient constant privé EMPTY, sinon, utiliser un nouveau mot-clé pour créer un nouveau sujet en option - ne lève une exception de NPE.
valeur déterminée est présent
Le procédé peut IsPresent () détermine si un objet est présent en option, si elle est présente, la méthode retourne vrai, sinon substitués false-- obj! = NULL est déterminée.
1Optional<String> opt = Optional.of("沉默王二");
2System.out.println(opt.isPresent()); // 输出:true
3
4Optional<String> optOrNull = Optional.ofNullable(null);
5System.out.println(opt.isPresent()); // 输出:false
Procédé Java après 11 peut aussi isEmpty () est déterminée avec IsPresent () résultat opposé.
1Optional<String> opt = Optional.of("沉默王二");
2System.out.println(opt.isPresent()); // 输出:false
3
4Optional<String> optOrNull = Optional.ofNullable(null);
5System.out.println(opt.isPresent()); // 输出:true
expression non NULL
classe facultative a une --ifPresent façon très moderne (), ce qui permet la façon dont nous utilisons la programmation fonctionnelle exécuter du code, donc je l'appelle une expression non vides. Sans cette méthode, nous avons généralement la première méthode objet en option vide après la condamnés mise en œuvre du code correspondant via IsPresent ():
1Optional<String> optOrNull = Optional.ofNullable(null);
2if (optOrNull.isPresent()) {
3 System.out.println(optOrNull.get().length());
4}
Avec IfPresent () plus tard, la situation est complètement différente, les expressions lambda peut être directement transmis à la méthode, le code est plus concis, plus intuitive.
1Optional<String> opt = Optional.of("沉默王二");
2opt.ifPresent(str -> System.out.println(str.length()));
Après 9 Java peut ifPresentOrElse (action, emptyAction) effectuer deux résultats, il exécute l'action est vide pas, emptyAction vide effectuée par la méthode.
1Optional<String> opt = Optional.of("沉默王二");
2opt.ifPresentOrElse(str -> System.out.println(str.length()), () -> System.out.println("为空"));
Set (get) les valeurs par défaut
Parfois, nous avons créé (acquis) objet en option, la nécessité d'une méthode de la valeur par défaut, OrElse () et orElseGet () est très pratique.
retour de la méthode OrElse () objet enveloppé la valeur optionnelle, si la valeur est non nul, alors, sinon retourne la valeur par défaut. Les types de paramètres de la méthode et la valeur du même type.
1String nullName = null;
2String name = Optional.ofNullable(nullName).orElse("沉默王二");
3System.out.println(name); // 输出:沉默王二
Procédé orElseGet () méthode OrElse () est similaire, mais avec différents types de paramètres. Facultatif Si l'objet est nulle, les paramètres de la fonction est exécutée.
1String nullName = null;
2String name = Optional.ofNullable(nullName).orElseGet(()->"沉默王二");
3System.out.println(name); // 输出:沉默王二
La sortie du point de forme et le code de vue, ces deux méthodes sont très similaires, ce qui ne peut pas aider mais éveiller nos soupçons, les concepteurs de la bibliothèque Java est nécessaire de le faire?
Supposons maintenant qu'il ya moyen d'un pour obtenir la valeur par défaut, d'une manière très traditionnelle.
1public static String getDefaultValue() {
2 System.out.println("getDefaultValue");
3 return "沉默王二";
4}
Ensuite, la méthode OrElse () et appel de méthode orElseGet (), méthode respectivement getDefaultValue () pour renvoyer la valeur par défaut.
1public static void main(String[] args) {
2 String name = null;
3 System.out.println("orElse");
4 String name2 = Optional.ofNullable(name).orElse(getDefaultValue());
5
6 System.out.println("orElseGet");
7 String name3 = Optional.ofNullable(name).orElseGet(OrElseOptionalDemo::getDefaultValue);
8}
Remarque: Le nom est le nom de classe :: syntaxe de la méthode introduite dans Java 8, suivi du nom de la méthode est pas (), ce qui indique que cette méthode ne sera pas nécessairement appelé.
La sortie est représentée ci-dessous:
1orElse
2getDefaultValue
3
4orElseGet
5getDefaultValue
La sortie est similaire, pas très différent de celui dans le cas de la valeur nulle objet facultatif. Si la valeur objet en option est non nul il?
1public static void main(String[] args) {
2 String name = "沉默王三";
3 System.out.println("orElse");
4 String name2 = Optional.ofNullable(name).orElse(getDefaultValue());
5
6 System.out.println("orElseGet");
7 String name3 = Optional.ofNullable(name).orElseGet(OrElseOptionalDemo::getDefaultValue);
8}
La sortie est représentée ci-dessous:
1orElse
2getDefaultValue
3orElseGet
Hey, appel orElseGet () ne va pas getDefaultValue (). Quelle méthode est la meilleure performance, vous obtenez le point?
Obtenez la valeur
De la méthode point de vue sémantique intuitive, GET () est la méthode la plus authentique d'acquisition de valeur de l'objet en option, mais malheureusement, le processus est vicié, parce que si l'objet en option est nulle, la méthode émet une exception NoSuchElementException. Ceci est tout à fait contraire à notre intention originale d'utiliser des classes optionnelles.
1public class GetOptionalDemo {
2 public static void main(String[] args) {
3 String name = null;
4 Optional<String> optOrNull = Optional.ofNullable(name);
5 System.out.println(optOrNull.get());
6 }
7}
Ce programme lancera une exception lors de l'exécution:
1Exception in thread "main" java.util.NoSuchElementException: No value present
2 at java.base/java.util.Optional.get(Optional.java:141)
3 at com.cmower.dzone.optional.GetOptionalDemo.main(GetOptionalDemo.java:9)
Bien qu'une exception est levée NoSuchElementException au lieu de NPE, mais à notre avis, est clairement dans le « chaudron ». Nous vous recommandons la méthode orElseGet () pour obtenir la valeur objet en option.
filtration valeurs
Wang avant la mise à niveau du code grâce à des cours en option, puis terminé joyeusement parler au cheval à la tâche. Nag pense que ce gars est bon, l'esprit vif, et le travail activement, il vaut la peine cultiver, et remis à nouveau sur Wang une nouvelle mission: vérifier la longueur du mot de passe lorsque l'enregistrement de l'utilisateur.
Après Wang a la tâche, ravi, parce qu'il était sur le point d'apprendre filtre méthode de classe en option (), qui est très pratique.
1public class FilterOptionalDemo {
2 public static void main(String[] args) {
3 String password = "12345";
4 Optional<String> opt = Optional.ofNullable(password);
5 System.out.println(opt.filter(pwd -> pwd.length() > 6).isPresent());
6 }
7}
Procédé filtre de type paramètre () est prédicats (Java 8, une nouvelle fonction d'interface), qui est une des expressions lambda peuvent être transmises à cette méthode, comme condition, si l'expression est évaluée à faux, alors un retour est vide objets en option ou objets retour en option après filtration.
Dans l'exemple ci-dessus, puisque la longueur du mot de passe est de 5, les résultats de sortie du programme à false. Supposons que la longueur du mot de passe est nécessaire entre 6-10, une condition peut encore être ajouté. Wang chercher à augmenter la difficulté de code.
1Predicate<String> len6 = pwd -> pwd.length() > 6;
2Predicate<String> len10 = pwd -> pwd.length() < 10;
3
4password = "1234567";
5opt = Optional.ofNullable(password);
6boolean result = opt.filter(len6.and(len10)).isPresent();
7System.out.println(result);
Les résultats de cette sortie de programme est vrai, parce que le mot de passe dans un 7, entre 6-10. Imaginez si Amy en utilisant if-else pour accomplir cette tâche, les codes plus longs.
valeur de conversion
Après vérification, la longueur du mot de passe Wang, se sentent encore que le plaisir ne suffit pas, sentir la nécessité de vérifier aussi la force des mots de passe, comme le mot de passe ne peut pas être « mot de passe », ce mot de passe est faible. Alors il a commencé à étudier la carte méthode (), qui peut suivre certaines règles pour convertir objet existant en option en option à un nouvel objet d'origine des objets ne changent pas en option.
Regardez d'abord un exemple simple Wang a écrit:
1public class OptionalMapDemo {
2 public static void main(String[] args) {
3 String name = "沉默王二";
4 Optional<String> nameOptional = Optional.of(name);
5 Optional<Integer> intOpt = nameOptional
6 .map(String::length);
7
8 System.out.println( intOpt.orElse(0));
9 }
10}
Dans l'exemple ci-dessus, les paramètres de la méthode Carte () Chaîne :: longueur, signifie que vous êtes le type de chaîne d'origine en option en option régénèrent un nouvel objet en fonction de la longueur de chaîne, le type entier.
Effacer la carte () méthode de l'utilisation de base, Wang a décidé de cartographier la méthode () avec le filtre () combiné avec l'ancien pour le mot de passe dans le minuscule, qui est utilisé pour déterminer la longueur et si « mot de passe » .
1public class OptionalMapFilterDemo {
2 public static void main(String[] args) {
3 String password = "password";
4 Optional<String> opt = Optional.ofNullable(password);
5
6 Predicate<String> len6 = pwd -> pwd.length() > 6;
7 Predicate<String> len10 = pwd -> pwd.length() < 10;
8 Predicate<String> eq = pwd -> pwd.equals("password");
9
10 boolean result = opt.map(String::toLowerCase).filter(len6.and(len10 ).and(eq)).isPresent();
11 System.out.println(result);
12 }
13}
Eh bien, mes chers lecteurs, qui est tout le contenu de cet article - sans doute le meilleur guide jamais en option, et l'on peut voir ici sont les meilleurs programmeurs, frère d'avoir à pouces vous pointez une louange.
Lien original:
https://blog.csdn.net/qing_gee/article/details/104767082
lecture recommandée
☞ baisse la reprise tendancielle du travail, télétravail entreprises technologiques ne peuvent « rester assis » faire?
☞ groupe américain d' une décennie, le plus grand plats à emporter du monde comment soutenir la fourniture de la plate - forme d'apprentissage automatique unique est de faire?
☞ Ma recommandation IDE nuage préféré!
☞ Les fonctionnalités avancées contrat écrit Solidité de l' intelligence
Vous regardez tous les points, je me suis sérieusement en tant que favori