在Java 8中,Optional類引入了一個新特性。Optional類允許我們將一個變數包裝起來,指示該變數是否為null。Optional在工程中被廣泛使用。實際上,Optional的許多方法都有默認實現。其中,Optional.empty()是一個很有趣的方法。本文將介紹Optional.empty()的相關內容,包括它的含義,使用場景,以及它實現的細節。
一、用Optional.empty()處理Null值
1、Optional.empty.throw
我們先來看一個例子,假設有一個實體類,類名為Student。Student有兩個屬性:name和age。現在我們要查找一個年齡為18的學生:
public class Student { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge(){ return age; } public void setAge(Integer age) { this.age = age; } } public class Main { public static Student findStudent(){ Student student = new Student(); student.setName("Tom"); return student; } public static void main(String[] args) { Student student = findStudent(); if(student != null && student.getAge() != null && student.getAge() == 18){ System.out.println(student.getName() + " is 18 years old"); }else{ System.out.println("No student found"); } } }
執行結果如下:
No student found
我們看到,如果找不到年齡為18歲的學生,就會輸出「No student found」。現在我們來修改主函數,運用Optional.empty()方法進行null值處理:
public static Optional findStudent(){ Student student = new Student(); student.setName("Tom"); return Optional.empty(); } public static void main(String[] args) { Optional studentOptional = findStudent(); if(studentOptional.isPresent()){ Student student = studentOptional.get(); if(student.getAge() == 18){ System.out.println(student.getName() + " is 18 years old"); }else{ System.out.println("No student found"); } }else{ System.out.println("No student found"); } }
這段代碼中,我們將findStudent()函數的返回值類型改為Optional。同時,在findStudent()函數中,我們返回了Optional.empty()。在主函數中,我們首先用if語句判斷studentOptional是否存在,如果存在,再通過get()方法獲取實際的Student對象。這樣,即使Student對象的某個屬性為null,我們也可以通過Optional.empty()進行判空處理。
2、Optional.empty.get
在上面的例子中,我們使用了Optional.empty()方法,這個方法返回的是一個空的Optional對象,它不包含任何值。代碼如下:
Optional.empty();
那麼,如果我們嘗試從Optional.empty()對象中獲取值,會發生什麼呢?看下面的代碼:
Optional optional = Optional.empty(); String str = optional.get();
這裡,我們嘗試從optional對象中獲取一個String類型的值,並賦值給str。由於optional是空的,所以程序會拋出NoSuchElementException異常。因此,如果使用Optional.empty()方法創建一個空的Optional對象,就需要使用isPresent()方法來判斷是否存在值。
二、使用Optional.empty()替代null
1、Optional.empty.orElse
在Java中,null值是很常見的,這也是Java編程中的一個大問題。由於null值的不可控性,經常會出現nullPointerException等運行時錯誤。為了解決這個問題,Optional類引入了Optional.empty()方法。有了它,我們可以先判斷是否為null值,再進行下一步操作。
接下來,我們看一個使用Optional.empty().orElse()替代null的例子:
public static void main(String[] args) { List list = new ArrayList(); list.add("apple"); list.add(null); list.add("banana"); list.add("orange"); list.add(null); list.add("pear"); List newList = new ArrayList(); for(String e : list){ Optional optional = Optional.ofNullable(e); if(optional.isPresent()){ newList.add(optional.get()); }else{ newList.add("unknown fruit"); } } System.out.println(newList); }
這個例子中,我們使用了Optional.ofNullable()方法,它可以返回空(即null)或一個非空的Optional對象。然後,我們用if語句判斷optional是否存在,如果存在,就將它獲取到的值添加到新的集合newList中,否則添加「unknown fruit」。運行結果如下:
[apple, unknown fruit, banana, orange, unknown fruit, pear]
可以看到,null值被替換成了「unknown fruit」,代碼的可讀性和可維護性得到了提高。
2、Optional.empty.filter
除了使用Optional.empty()方法替代null值之外,我們還可以使用Optional.empty()方法對非null值進行一些其他的處理。這裡,我們看一個使用Optional.empty().filter()方法進行判斷的例子。
Optional optional = Optional.of(3); optional.filter(e -> e > 2).ifPresent(System.out::println);
這個例子中,我們使用Optional.of()方法創建一個包含非null值的Optional對象。然後,我們使用filter()方法對其進行判斷,如果其值大於2,則執行ifPresent()方法內的操作。因為3大於2,所以輸出如下:
3
除了使用filter()方法,Optional還提供了map()方法,flatMap()方法等類似的方法,用於對非null值進行修改。
三、Optional.empty的缺點
雖然Optional.empty()方法已經減少了null值帶來的問題,但它也有一些缺點。首先,Optional.empty()方法無法處理基本數據類型,如int、double、float等。其次,使用Optional.empty()方法會增加代碼的複雜度和運行時間。所以,在實際應用中,我們需要權衡利弊,謹慎選擇是否使用Optional.empty()方法。
原創文章,作者:YYIIM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/349489.html