在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
微信掃一掃
支付寶掃一掃