轉載請註明出處:
empty : 建立一個空的Optional物件
of:為非null的值建立一個Optional。of方法通過工廠方法建立Optional類。需要注意的是,建立物件時傳入的引數不能為null。如果傳入引數為null,則丟擲NullPointerException。因此不經常用。
ofNullable:為指定的值建立一個Optional,如果指定的值為null,則返回一個空的Optional。
isPresent: 檢查一個Optional物件中是否有值,只有值非空才返回truex,否則返回false。
ifPresent:如果Optional範例有值則為其呼叫consumer,否則不做處理
get:如果Optional有值則將其返回,否則丟擲NoSuchElementException。因此也不經常用。
orElse:如果有值則將其返回,否則返回指定的其它值。經常用於判斷返回預設值的場景;
orElseGet:orElseGet與orElse方法類似,區別在於得到的預設值。orElse方法將傳入的字串作為預設值,orElseGet方法可以接受Supplier介面的實現用來生成預設值
orElseThrow:如果有值則將其返回,否則丟擲supplier介面建立的異常。
filter: 接收一個函數式介面 ,如果有值並且滿足斷言條件返回包含該值的Optional,否則返回空Optional。
map:如果有值,則對其執行呼叫mapping函數得到返回值。如果返回值不為null,則建立包含mapping返回值的Optional作為map方法返回值,否則返回空Optional。
flatMap:如果有值,為其執行mapping函數返回Optional型別返回值,否則返回空Optional。
範例一:
根據使用者的物件獲取使用者的名稱,如果存在則返回使用者名稱稱,沒有則返回 unknown ;沒有使用 Option 的 Java 實現程式碼如下:
public static String getName2(User user){
if (user!=null){
String name = user.getName();
if (StringUtils.isBlank(name)){
return "unKnown";
}
return name;
}
return "unKnown";
}
沒有使用Optional 時,需要不斷的判斷是否為空,增加了程式碼的可讀性和維護性,使用 Optional 之後,程式碼如下:
public static String getName(User user){
return Optional.ofNullable(user).map(p->p.getName()).orElse("unKnown");
}
使用Optional 之後,通過一行便完成了 上述的功能,減少了層層的 if 判斷
從一批學生中,選出年齡大於等於18,參加過考試並且成績大於80的人去參加比賽。
public void useJava8() {
List<Student> studentList = initData();
for (Student student : studentList) {
Optional<Student> studentOptional = Optional.of(student);
Integer score = studentOptional.filter(s -> s.getAge() >= 18).map(Student::getScore).orElse(0);
if (score > 80) {
System.out.println("入選:" + student.getName());
}
}
}