JDK8中新增的Optional工具類基本使用
Optional類的使用
JDK8以前,編寫代碼,通常會(huì)出現(xiàn) NullPointerException (空指針異常),通常情況下我們都是通過 if ... else... 來對(duì)對(duì)象進(jìn)行為空判斷,然后再進(jìn)行邏輯處理,代碼寫起來也比較冗余。
JDK8新增了Optional類,使用該類可以避免我們對(duì)空指針的檢查,使代碼看起來比較優(yōu)雅。
最近剛好有空給大家整理下JDK8的特性,這個(gè)在實(shí)際開發(fā)中的作用也是越來越重了,本文重點(diǎn)講解下Optional
這個(gè)Optional類注意是解決空指針的問題
1. 以前對(duì)null 的處理
@Test public void test01(){ //String userName = "張三"; String userName = null; if(userName != null){ System.out.println("字符串的長(zhǎng)度:" + userName.length()); }else{ System.out.println("字符串為空"); } }
2. Optional類
Optional是一個(gè)沒有子類的工具類,Optional是一個(gè)可以為null的容器對(duì)象,它的主要作用就是為了避免Null檢查,防止NullpointerException,
3. Optional的基本使用
Optional對(duì)象的創(chuàng)建方式
/** * Optional對(duì)象的創(chuàng)建方式 */ @Test public void test02(){ // 第一種方式 通過of方法 of方法是不支持null的 Optional<String> op1 = Optional.of("zhangsan"); //Optional<Object> op2 = Optional.of(null); // 第二種方式通過 ofNullable方法 支持null Optional<String> op3 = Optional.ofNullable("lisi"); Optional<Object> op4 = Optional.ofNullable(null); // 第三種方式 通過empty方法直接創(chuàng)建一個(gè)空的Optional對(duì)象 Optional<Object> op5 = Optional.empty(); }
4. Optional的常用方法
/** * Optional中的常用方法介紹 * get(): 如果Optional有值則返回,否則拋出NoSuchElementException異常 * get()通常和isPresent方法一塊使用 * isPresent():判斷是否包含值,包含值返回true,不包含值返回false * orElse(T t):如果調(diào)用對(duì)象包含值,就返回該值,否則返回t * orElseGet(Supplier s):如果調(diào)用對(duì)象包含值,就返回該值,否則返回 Lambda表達(dá)式的返回值 */ @Test public void test03(){ Optional<String> op1 = Optional.of("zhangsan"); Optional<String> op2 = Optional.empty(); // 獲取Optional中的值 if(op1.isPresent()){ String s1 = op1.get(); System.out.println("用戶名稱:" +s1); } if(op2.isPresent()){ System.out.println(op2.get()); }else{ System.out.println("op2是一個(gè)空Optional對(duì)象"); } String s3 = op1.orElse("李四"); System.out.println(s3); String s4 = op2.orElse("王五"); System.out.println(s4); String s5 = op2.orElseGet(()->{ return "Hello"; }); System.out.println(s5); }
@Test public void test04(){ Optional<String> op1 = Optional.of("zhangsan"); Optional<String> op2 = Optional.empty(); // 如果存在值 就做什么 op1.ifPresent(s-> System.out.println("有值:" +s)); op1.ifPresent(System.out::println); } /** * 自定義一個(gè)方法,將Person對(duì)象中的 name 轉(zhuǎn)換為大寫 并返回 */ @Test public void test05(){ Person p = new Person("zhangsan",18); Optional<Person> op = Optional.of(p); String name = getNameForOptional(op); System.out.println("name="+name); } /** * 根據(jù)Person對(duì)象 將name轉(zhuǎn)換為大寫并返回 * 通過Optional方式實(shí)現(xiàn) * @param op * @return */ public String getNameForOptional(Optional<Person> op){ if(op.isPresent()){ String msg = //op.map(p -> p.getName()) op.map(Person::getName) //.map(p -> p.toUpperCase()) .map(String::toUpperCase) .orElse("空值"); return msg; } return null; } /** * 根據(jù)Person對(duì)象 將name轉(zhuǎn)換為大寫并返回 * @param person * @return */ public String getName(Person person){ if(person != null){ String name = person.getName(); if(name != null){ return name.toUpperCase(); }else{ return null; } }else{ return null; } }
~好了,Optional真的很簡(jiǎn)單,其實(shí)大家只要了解了它在工作中還是蠻有用的
以上就是JDK8中新增的Optional工具類基本使用的詳細(xì)內(nèi)容,更多關(guān)于JDK8 Optional工具類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IntelliJ IDEA 老司機(jī)居然還沒用過 Stream Trace功能(問題小結(jié))
很多朋友酷愛Java8 Stream功能,但是在使用過程中總不是那么順利,下面通過本文給大家分享idea Stream Trace調(diào)試過程遇到的問題,需要的朋友參考下吧2021-05-05解決Spring?Boot應(yīng)用打包后文件訪問問題
在Spring Boot項(xiàng)目的開發(fā)過程中,一個(gè)常見的挑戰(zhàn)是如何有效地訪問和操作資源文件,本文就來介紹一下解決Spring?Boot應(yīng)用打包后文件訪問問題,感興趣的可以了解一下2024-01-01SpringBoot+MyBatis-Plus實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的代碼示例
在當(dāng)今互聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)庫讀寫分離是提高系統(tǒng)性能和穩(wěn)定性的重要手段之一,通過將讀操作和寫操作分別路由到不同的數(shù)據(jù)庫節(jié)點(diǎn),可以有效減輕數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān),本文將介紹如何利用SpringBoot和MyBatis-Plus框架實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離,需要的朋友可以參考下2023-11-11javaweb設(shè)計(jì)中filter粗粒度權(quán)限控制代碼示例
這篇文章主要介紹了javaweb設(shè)計(jì)中filter粗粒度權(quán)限控制代碼示例,小編覺得還是挺不錯(cuò)的,需要的朋友可以參考。2017-10-10繼承jpa?Repository?寫自定義方法查詢實(shí)例
這篇文章主要介紹了繼承jpa?Repository?寫自定義方法查詢實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12java多線程中的生產(chǎn)者和消費(fèi)者隊(duì)列詳解
這篇文章主要介紹了java多線程中的生產(chǎn)者和消費(fèi)者隊(duì)列詳解,隊(duì)列,是一種數(shù)據(jù)結(jié)構(gòu),除了優(yōu)先級(jí)隊(duì)列和LIFO隊(duì)列外,隊(duì)列都是以FIFO(先進(jìn)先出)的方式對(duì)各個(gè)元素進(jìn)行排序的,需要的朋友可以參考下2024-01-01