Optional est une classe nouvellement introduite dans Java 8
Il s'agit d'un conteneur qui peut être un objet nul. Si la valeur existe, la méthode isPresent() renverra true et l'appel de la méthode get() renverra l'objet.
java.lang.NullPointerException, tant que vous osez vous qualifier de programmeur Java, vous connaîtrez très bien cette exception. Afin d'éviter que cette exception ne soit levée, nous écrivons souvent du code comme celui-ci :
Person person = people.find("John Smith"); if (person != null) { person.doSomething(); }
Malheureusement, dans la plupart des codes Java, nous oublions souvent de vérifier les références nulles, donc NullPointerException a également suivi .
"Null Sucks." C'est l'évaluation de null par Doug Lea. En tant que programmeur Java, si vous ne savez toujours pas qui est Doug Lea, alors dépêchez-vous et rattrapez les leçons. Sans sa contribution, nous ne pouvons utiliser que l'équipement Java le plus primitif pour gérer le multi-threading.
"J'appelle cela mon erreur d'un milliard de dollars.", qui est qualifié pour dire que c'est l'inventeur de la référence nulle, Sir C. A. R. Hoare. Vous n'êtes pas obligé de connaître Doug Lea, mais vous devez connaître ce vieil homme, sinon vous n'êtes pas qualifié pour utiliser le tri rapide.
Dans le monde Java, une manière courante de résoudre le problème de référence nulle consiste à utiliser le mode Null Object. Dans ce cas, dans le cas de « rien », Null Object est renvoyé et le code client n'a pas besoin de juger s'il est vide. Cependant, cette approche pose certains problèmes. Tout d’abord, nous devons absolument écrire du code pour Null Object, et si nous voulons appliquer ce modèle à grande échelle, nous devons écrire Null Object pour presque toutes les classes.
Heureusement, nous avons une autre option : Facultative. Facultatif est une encapsulation d’objets nullables, et ce n’est pas compliqué à implémenter. Dans certains langages, tels que Scala, l'implémentation facultative devient partie intégrante du langage. Pour les programmeurs Java, Guava nous fournit un support facultatif. Sans plus tarder, parlons d’abord de la façon d’utiliser Facultatif pour compléter le code précédent.
Optional person = people.find("John Smith"); if (person.isPresent()) { person.get().doSomething(); }
Si isPresent() renvoie false ici, cela signifie qu'il s'agit d'un objet vide. Sinon, nous pouvons retirer le contenu et faire ce que nous voulons faire.
Si vous attendez avec impatience une réduction de la taille du code, je crains que vous ne soyez déçu ici. Rien qu’en termes de taille de code, Optionnel contient même plus de code que l’original. Mais la bonne nouvelle est que vous n'oublierez jamais de vérifier null, car ce que nous obtenons ici n'est pas un objet de la classe Person, mais un facultatif.
Ce qui suit est le code pour la pratique personnelle
public class OptionalTest { /** * of后面接给optional设置的值 但是不能为空 如果为空会报空指针异常 * @Title: ofTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void ofTest() { Optional<String> optional = Optional.of("123"); System.out.println(optional.get()); try { optional = Optional.of(null); System.out.println(optional.get()); //get方法是获取optional的值 类型取决于声明的时候 }catch(NullPointerException e) { System.out.println("空指针异常"); } } /** * ofNullable 和of类似 但是ofNullable可以设置null值 如果是Null值得话取值会报NoSuchElementException 异常 * @Title: ofNullableTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void ofNullableTest() { Optional<String> optional = Optional.ofNullable("123"); System.out.println(optional.get()); try { optional = Optional.ofNullable(null); System.out.println(optional.get()); }catch(NoSuchElementException e) { System.out.println("NoSuchElementException 异常"); } } /** * ifPresent用来判断optional中有没有值存在 如果有则为真 * @Title: isPresentTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void isPresentTest() { Optional<String> optional = Optional.ofNullable(null); if(optional.isPresent()) { System.out.println(optional.get()); } else { System.out.println("值为空"); } } /** * ifPresent和isPresent类似 只不过它支持λ表达式 * @Title: ifPresentTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void ifPresentTest() { Optional<String> optional = Optional.ofNullable("123"); optional.ifPresent(var ->{ System.out.println(var); }); } /** * orElse方法,如果值为空的话会用参数中的值去替换 即设置默认值 * @Title: orElseTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void orElseTest() { Optional<String> optional = Optional.ofNullable("123"); System.out.println(optional.orElse("有没有")); optional = Optional.ofNullable(null); System.out.println(optional.orElse("有没有")); } /** * orElseGet方法 和orElse类似 不过此方法接受Supplier接口的实现用来生成默认值 * @Title: orElseGetTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void orElseGetTest() { Optional<String> optional = Optional.ofNullable("123"); System.out.println(optional.orElseGet(()->"123456")); optional = Optional.ofNullable(null); System.out.println(optional.orElseGet(()->"123456")); } /** * map方法 如果有值则会对值进行mapping中的处理 处理结果存在则创建并返回Optional类型的结果 否则返回空 * @Title: mapTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void mapTest() { Optional<String> optional = Optional.ofNullable("abc"); System.out.println(optional.map(var->var.toUpperCase()).get()); } /** * flatMap和map类似 只不过mapping中必须返回Option类型的数据 * @Title: flatMapTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void flatMapTest() { Optional<String> optional = Optional.ofNullable("abc"); System.out.println(optional.flatMap(var->Optional.of(var.toUpperCase())).get()); } /** * filter对optional进行过滤,mapping中为过滤的条件 如果不满足条件 返回一个为空的Optional * @Title: filterTest * @Description: TODO * @param: * @return: void * @throws */ @Test public void filterTest() { try { Optional<String> optional = Optional.ofNullable("一二三四五六七八"); System.out.println(optional.filter(var ->var.length()>6).get()); System.out.println(optional.filter(var ->var.length()<6).get()); }catch(NoSuchElementException e) { System.out.println("optional的值为空"); } }
[Recommandations associées]
1 Utilisation d'Optional, une nouvelle API en Java. 8 Exemple
2. Analyse Java 8 Tutoriel d'exemple de classe facultatif
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!