Optional ist eine neu eingeführte Klasse in Java 8
Dies ist ein Container, der das kann sei ein Nullobjekt. Wenn der Wert vorhanden ist, gibt die Methode isPresent() true zurück und der Aufruf der Methode get() gibt das Objekt zurück.
java.lang.NullPointerException: Solange Sie es wagen, sich selbst als Java-Programmierer zu bezeichnen, sind Sie mit dieser Ausnahme bestens vertraut. Um zu verhindern, dass diese Ausnahme ausgelöst wird, schreiben wir oft Code wie diesen:
Person person = people.find("John Smith"); if (person != null) { person.doSomething(); }
Leider vergessen wir in den meisten Java-Codes oft, nach Nullverweisen zu suchen, daher folgte auch NullPointerException .
„Null Sucks.“ Das ist Doug Leas Einschätzung von Null. Wenn Sie als Java-Programmierer immer noch nicht wissen, wer Doug Lea ist, dann beeilen Sie sich und machen Sie die Lektionen nach. Ohne seinen Beitrag können wir nur die primitivste Ausrüstung von Java verwenden, um Multithreading zu handhaben.
„Ich nenne es meinen Milliarden-Dollar-Fehler.“, der dies behaupten kann, ist der Erfinder der Nullreferenz, Sir C. A. R. Hoare. Sie müssen Doug Lea nicht kennen, aber Sie müssen diesen alten Mann kennen, sonst sind Sie nicht für die schnelle Sortierung qualifiziert.
In der Java-Welt ist die Verwendung des Null-Object-Modus eine gängige Methode zur Lösung des Nullreferenzproblems. In diesem Fall wird im Fall von „nichts“ ein Nullobjekt zurückgegeben, und der Clientcode muss nicht beurteilen, ob es leer ist. Allerdings gibt es bei diesem Ansatz einige Probleme. Zuerst müssen wir unbedingt Code für Null Object schreiben, und wenn wir dieses Muster maßstabsgetreu anwenden wollen, müssen wir Null Object für fast jede Klasse schreiben.
Zum Glück haben wir noch eine weitere Option: Optional. Optional ist eine Kapselung von Nullable-Objekten und die Implementierung ist nicht kompliziert. In einigen Sprachen, wie z. B. Scala, wird die optionale Implementierung Teil der Sprache. Für Java-Programmierer bietet Guava optionalen Support. Lassen Sie uns ohne weitere Umschweife zunächst darüber sprechen, wie Sie Optional verwenden, um den vorherigen Code zu vervollständigen.
Optional person = people.find("John Smith"); if (person.isPresent()) { person.get().doSomething(); }
Wenn isPresent() hier false zurückgibt, bedeutet dies, dass es sich um ein leeres Objekt handelt. Andernfalls können wir den Inhalt herausnehmen und tun, was wir tun möchten.
Wenn Sie sich auf eine Reduzierung der Codegröße freuen, werden Sie hier leider enttäuscht sein. Allein hinsichtlich der Codegröße verfügt Optional sogar über mehr Code als das Original. Aber das Gute ist, dass Sie nie vergessen werden, nach Null zu suchen, denn was wir hier bekommen, ist kein Objekt der Person-Klasse, sondern ein Optional.
Das Folgende ist der Code für die persönliche Praxis
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的值为空"); } }
[Verwandte Empfehlungen]
1. Verwendung von Optional, einer neuen API in Java 8 Beispiel2.
Parsing Java 8 Optionales Klassenbeispiel-Tutorial
Das obige ist der detaillierte Inhalt vonTeilen Sie den Beispielcode der neu eingeführten Klasse Optional in Java8. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!