JDK8中新增的Optional工具類基本使用
Optional類的使用
JDK8以前,編寫代碼,通常會出現(xiàn) NullPointerException (空指針異常),通常情況下我們都是通過 if ... else... 來對對象進行為空判斷,然后再進行邏輯處理,代碼寫起來也比較冗余。
JDK8新增了Optional類,使用該類可以避免我們對空指針的檢查,使代碼看起來比較優(yōu)雅。
最近剛好有空給大家整理下JDK8的特性,這個在實際開發(fā)中的作用也是越來越重了,本文重點講解下Optional
這個Optional類注意是解決空指針的問題
1. 以前對null 的處理
@Test public void test01(){ //String userName = "張三"; String userName = null; if(userName != null){ System.out.println("字符串的長度:" + userName.length()); }else{ System.out.println("字符串為空"); } }
2. Optional類
Optional是一個沒有子類的工具類,Optional是一個可以為null的容器對象,它的主要作用就是為了避免Null檢查,防止NullpointerException,
3. Optional的基本使用
Optional對象的創(chuàng)建方式
/** * Optional對象的創(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)建一個空的Optional對象 Optional<Object> op5 = Optional.empty(); }
4. Optional的常用方法
/** * Optional中的常用方法介紹 * get(): 如果Optional有值則返回,否則拋出NoSuchElementException異常 * get()通常和isPresent方法一塊使用 * isPresent():判斷是否包含值,包含值返回true,不包含值返回false * orElse(T t):如果調(diào)用對象包含值,就返回該值,否則返回t * orElseGet(Supplier s):如果調(diào)用對象包含值,就返回該值,否則返回 Lambda表達式的返回值 */ @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是一個空Optional對象"); } 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); } /** * 自定義一個方法,將Person對象中的 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對象 將name轉(zhuǎn)換為大寫并返回 * 通過Optional方式實現(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對象 將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真的很簡單,其實大家只要了解了它在工作中還是蠻有用的
以上就是JDK8中新增的Optional工具類基本使用的詳細內(nèi)容,更多關(guān)于JDK8 Optional工具類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IntelliJ IDEA 老司機居然還沒用過 Stream Trace功能(問題小結(jié))
很多朋友酷愛Java8 Stream功能,但是在使用過程中總不是那么順利,下面通過本文給大家分享idea Stream Trace調(diào)試過程遇到的問題,需要的朋友參考下吧2021-05-05解決Spring?Boot應(yīng)用打包后文件訪問問題
在Spring Boot項目的開發(fā)過程中,一個常見的挑戰(zhàn)是如何有效地訪問和操作資源文件,本文就來介紹一下解決Spring?Boot應(yīng)用打包后文件訪問問題,感興趣的可以了解一下2024-01-01SpringBoot+MyBatis-Plus實現(xiàn)數(shù)據(jù)庫讀寫分離的代碼示例
在當今互聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)庫讀寫分離是提高系統(tǒng)性能和穩(wěn)定性的重要手段之一,通過將讀操作和寫操作分別路由到不同的數(shù)據(jù)庫節(jié)點,可以有效減輕數(shù)據(jù)庫服務(wù)器的負擔(dān),本文將介紹如何利用SpringBoot和MyBatis-Plus框架實現(xiàn)數(shù)據(jù)庫讀寫分離,需要的朋友可以參考下2023-11-11javaweb設(shè)計中filter粗粒度權(quán)限控制代碼示例
這篇文章主要介紹了javaweb設(shè)計中filter粗粒度權(quán)限控制代碼示例,小編覺得還是挺不錯的,需要的朋友可以參考。2017-10-10