淺析Java中如何優(yōu)雅地處理null值
假設(shè)我們有一個(gè)學(xué)生對(duì)象,以及這個(gè)學(xué)生對(duì)象的 Optional 包裝器:
public class Student { private String name; private Integer age; // 全參構(gòu)造函數(shù) public Student(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public Integer getAge() { return age; } // toString 方法 @Override public String toString() { return"Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
public class OptionalTest { public static void main(String[] args) { Student student = new Student("Bob", 18); Optional<Student> studentOpt = Optional.ofNullable(student); } }
如果不與 Lambda 結(jié)合使用,Optional 并不能簡(jiǎn)化原本繁瑣的 null 值檢查。例如:
// 編寫(xiě)方法 1 if (student == null) { return UNKNOWN_STUDENT; } else { return student; } // 編寫(xiě)方法 2 if (!studentOpt.isPresent()) { return UNKNOWN_STUDENT; } else { return studentOpt.get(); }
只有將 Optional 與 Lambda 結(jié)合使用,才能發(fā)揮它真正的威力!
現(xiàn)在,讓我們對(duì)比一下 Java 8 中 Lambda + Optional 與傳統(tǒng) Java 在以下四種常見(jiàn) null 處理場(chǎng)景中的差異。
場(chǎng)景 1:不為 null 則執(zhí)行
// if 語(yǔ)句 if (student!= null) { System.out.println(student); } // Optional studentOpt.ifPresent(System.out::println);
場(chǎng)景 2:不為 null 則返回,為 null 則返回特定值或拋出異常
// if 語(yǔ)句 if (student == null) { return UNKNOWN_STUDENT; // 或拋出異常 } else { return student; } // Optional return studentOpt.orElse(UNKNOWN_STUDENT); return studentOpt.orElseThrow(RuntimeException::new);
場(chǎng)景 3:不為 null 則返回,為 null 則由調(diào)用方法
// if 語(yǔ)句 if (student == null) { return UNKNOWN_STUDENT; } else { return generateWithFunction(); } // Optional return studentOpt.orElseGet(() -> generateWithFunction());
場(chǎng)景 4:嵌套 null 檢查
// Java 7 if (student!= null) { String name = student.getName(); if (name!= null) { return name; } else { return null; } } else { return null; } // Java 8 return studentOpt.map(Student::getName).orElse(null);
從以上四種場(chǎng)景可以明顯看出,Optional + Lambda 讓我們少寫(xiě)了很多 if-else 代碼塊。尤其是場(chǎng)景 4,傳統(tǒng)的 Java 寫(xiě)法顯得冗長(zhǎng)且難以理解,而 Optional+Lambda 則簡(jiǎn)潔明了,清晰易懂。
總結(jié)
通過(guò)結(jié)合 Lambda 表達(dá)式和 Optional,Java 的 null 處理變得更加優(yōu)雅和簡(jiǎn)潔。希望這篇文章能幫助你更好地理解和使用這些特性。
到此這篇關(guān)于淺析Java中如何優(yōu)雅地處理null值的文章就介紹到這了,更多相關(guān)Java處理null值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot2啟動(dòng)時(shí)執(zhí)行,初始化(或定時(shí)任務(wù))servletContext問(wèn)題
這篇文章主要介紹了springboot2啟動(dòng)時(shí)執(zhí)行,初始化(或定時(shí)任務(wù))servletContext問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01java實(shí)現(xiàn)全局監(jiān)聽(tīng)鍵盤詳解
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)全局監(jiān)聽(tīng)鍵盤的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2024-01-01Spring的BeanUtils.copyProperties屬性復(fù)制避坑指南
這篇文章主要介紹了Spring的BeanUtils.copyProperties屬性復(fù)制避坑指南,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用
這篇文章主要介紹了詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11java實(shí)現(xiàn)簡(jiǎn)單斗地主(看牌排序)
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單斗地主,看牌進(jìn)行排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2010-11-11RocketMQ?NameServer架構(gòu)設(shè)計(jì)啟動(dòng)流程
這篇文章主要為大家介紹了RocketMQ?NameServer架構(gòu)設(shè)計(jì)啟動(dòng)流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Eclipse設(shè)置svn忽略文件或文件夾(svn:ignore)的操作
這篇文章主要介紹了Eclipse設(shè)置svn忽略文件或文件夾(svn:ignore)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01