Optional簡化空值判斷,減少程式碼中的if-else程式碼塊
為了防止空指標異常的出現,Java8中引入了一個新類Optional,對於它之前我們已經進行了簡單的實現。其本質就是通過Optional類對值進行封裝, 當有值的時候,會把該值封裝到Optional類中。如果沒有值的話,則會在該類封裝一個Empty
建立Optional物件
//empty()會直接返回一個空的Optional例項,內部不會存在任何值。
Optional<Student> studentOptional = Optional.empty();
//of()會返回一個存在值的Optional物件,並且該值不允許null的存在。如果呼叫該方法時傳入引數是null,則立刻丟擲NullPointerException,而不是等到你用這個物件時才丟擲,相當於進行了立即檢查。
Optional<Student> studentOptional = Optional.of(student);
//ofNullable()同樣也會返回一個存在值的Optional物件,但是它和of()最大的不同在於,它會對傳入的值進行判斷,如果傳入的值為null,其會呼叫empty()返回一個不包含內容的Optional,如果不為null,則會呼叫of()返回一個包含內容的Optional
Optional<Student> studentOptional = Optional.ofNullable(student);
isPresent()與ifPresent()應用
public class PresentDemo {
public static void getStudentName(Student student){
Optional<Student> studentOptional = Optional.ofNullable(student);
//isPresent()只會單純做判斷
if (studentOptional.isPresent()){
//存在
System.out.println("student存在");
}else {
System.out.println("student不存在");
}
//該方法在執行時,接收一個consumer函式式介面,如果value不為null,則通過consumer中的accept方法獲取該值。
studentOptional.ifPresent((x)-> System.out.println("存在"));
}
public static void main(String[] args) {
Student student = new Student();
getStudentName(student);
}
}
get()與orElseThrow()應用
get()的使用非常簡單,但不安全,因為其在獲取值的時候,如果值存在,則直接返回封裝在Optional中的值,如果不存在,則丟擲NoSuchElementException。因此它的使用前提是已經確定Optional中有值,否則沒有使用意義。
orElseThrow()當Optional中沒有值時,get()會直接丟擲NoSuchElementException,這樣的話,就存在了一定的侷限性,因為有時可能需要丟擲自定義異常。此時就可以使用orElseThrow(),它在取值時,如果Optional中沒有值時,可以丟擲自定義異常。
public class MyException extends Throwable {
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
@Override
public String getMessage() {
return "exception message";
}
}
public class OrElseThrowDemo {
public static void getStudentInfo(Student student) {
Optional<Student> studentOptional = Optional.ofNullable(student);
try {
Student student1 = studentOptional.orElseThrow(MyException::new);
} catch (MyException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Student student = null;
getStudentInfo(student);
}
}
map()與flatMap()應用
//map的作用就是直接取值
if (studentOptional.isPresent()){
Optional<String> nameOptional = studentOptional.map(Student::getName);
}
在學生類中加新的屬性
//Student類新增Job屬性
private Optional<Job> job;
//Job類新增Company屬性
private Optional<ComPany> comPany;
如果想拿到上述的值,通過連環的map是拿不到的,因為每一次在呼叫的時候,都會對Optional的泛型進行改變,最終產生多層Optional巢狀的結構,這時就需要用到flatMap()
Optional<String> nameOptional =
studentOptional.flatMap(Student::getJob).flatMap(Job::getCompany).map(Company::getName);
filter()應用
對應著以前使用的equals方法,就是匹配
//傳統寫法
Company company = optional().get();
if("test".equals(company.getName)){
sout(company);
Optional<Company> company = companyOptional.filter(c ‐> "test".equals(c.getName()));
}
orElse()與orElseGet()應用
在取值的時候,如果值不存在,有時我們會考慮返回一個預設值。該需求就可以通過orElse()實現。其內部會判斷值是否為null,如果不為null,則返回該值,如果為null,則返回傳入的預設值。
orElseGet()也是用於當Optional中沒有值時,返回預設值的方法。但是它與orElse()的區別在於,它是延遲載入的。只有當Optional中沒有值是才會被呼叫。
public class Demo1 {
public static void getCompanyName(Student student) {
Optional<Student> studentOptional = Optional.ofNullable(student);
if (studentOptional.isPresent()) {
String value1 =
studentOptional.flatMap(Student::getJob).flatMap(Job::getCompany).map(Company::getName).orElse(g
et("a"));
String value2 =
studentOptional.flatMap(Student::getJob).flatMap(Job::getCompany).map(Company::getName).orElseGe
t(()‐>get("b"));
System.out.println("a: "+value1);
System.out.println("b: "+value2);
}
}
public static String get(String name) {
System.out.println(name + "執行了方法");
return "exec";
}
public static void main(String[] args) {
Company company = new Company();
//company.setName("test");
Optional<Company> companyOptional = Optional.of(company);
Job job = new Job();
job.setName("pm");
job.setCompany(companyOptional);
Optional<Job> jobOptional = Optional.of(job);
Student s1 = new Student();
s1.setName("張三");
s1.setJob(jobOptional);
getCompanyName(s1);
}
}
a執行了方法
b執行了方法
a: exec
b: exec
public class Demo1 {
public static void getCompanyName(Student student) {
Optional<Student> studentOptional = Optional.ofNullable(student);
if (studentOptional.isPresent()) {
String value1 =
studentOptional.flatMap(Student::getJob).flatMap(Job::getCompany).map(Company::getName).orElse(g
et("a"));
String value2 =
studentOptional.flatMap(Student::getJob).flatMap(Job::getCompany).map(Company::getName).orElseGe
t(()‐>get("b"));
System.out.println("a: "+value1);
System.out.println("b: "+value2);
}
}
public static String get(String name) {
System.out.println(name + "執行了方法");
return "exec";
}
public static void main(String[] args) {
Company company = new Company();
company.setName("test");
Optional<Company> companyOptional = Optional.of(company);
Job job = new Job();
job.setName("pm");
job.setCompany(companyOptional);
Optional<Job> jobOptional = Optional.of(job);
Student s1 = new Student();
s1.setName("張三");
s1.setJob(jobOptional);
getCompanyName(s1);
}
}
a執行了方法
a: test
b: test
相關文章
- 減少程式碼中該死的 if else 巢狀巢狀
- 判斷空值
- 論減少程式碼中return語句的騷操作
- 為了減少程式碼複雜度,我將if-else升級為面向狀態程式設計複雜度程式設計
- if-else程式碼優化的八種方案優化
- java中的程式碼塊(初始化塊)Java
- 程式碼優化-多型代替IF條件判斷優化多型
- 消除程式碼中的 if-else/switch-case
- js程式碼判斷瀏覽器JS瀏覽器
- Java 中的程式碼塊Java
- Java中的程式碼塊Java
- Java中靜態程式碼塊、構造程式碼塊、建構函式、普通程式碼塊Java函式
- 程式碼初始化塊
- Java優化if-else程式碼幾個解決方案Java優化
- 【優雅程式碼】03-optional杜絕空指標異常指標
- Lombok——程式碼簡化Lombok
- 經過4次優化我把python程式碼耗時減少95%優化Python
- Java 8 中的方法引用,輕鬆減少程式碼量,提升可讀性!Java
- 優雅地減少redux請求樣板程式碼Redux
- 【Java8新特性】Optional類在處理空值判斷場景的應用 迴避空指標異常 編寫健壯的應用程式Java指標
- 判斷一個物件是否為空物件,判斷一個物件中是否有空值物件
- 前端業務程式碼配置化處理條件判斷邏輯前端
- 判斷一個數是否為質數(程式碼)
- Ruby 中的閉包-程式碼塊
- 優化If else(簡化程式碼)優化
- Java普通程式碼塊,構造程式碼塊,靜態程式碼塊區別,執行順序的程式碼例項Java
- 修改他人程式碼:怎麼才能減少釋出Bug概率?
- 程式碼塊
- [譯]如何在你的Kotlin程式碼中移除所有的!!(非空斷言)Kotlin
- 一個小技巧助您減少if語句的狀態判斷
- Java判斷欄位是否為空,為空賦值 ?Java賦值
- Java基礎程式碼季節判斷季節1Java
- Java中建構函式、靜態程式碼塊、程式碼塊的執行順序Java函式
- Typora 程式碼塊Mac風格化Mac
- SOFAStack推出雲原生產品BizStack 可減少30%程式碼量AST
- Vue 減少和服務端互動的樣板程式碼一種方法Vue服務端
- pycharm一些減少程式碼warning的拼寫檢查設定PyCharm
- 使用Java8中的Optional類來消除程式碼中的null檢查JavaNull