前言:
-
Optional是java8中增加的API,可以很好的解決空指針異常,而不用我們來進行顯式的空值檢測。- 比如說
Optional可以是一個為null的容器。Optional.ofNullable(null) -
isPresent方法當(dāng)值存在時返回true,調(diào)用get()方法返回其對象
- 比如說
粗看Java8中的API
Optional中的方法,獲取Optional中的值用get()方法就可以了,那么和orElse()、orElseGet()的獲取值的方法有什么不同呢?當(dāng)我們在IDEA中使用
get()時,IDEA會高亮提示,此方法需要先用isPresent()進行判斷,然后再調(diào)用get()方法-
以前沒有推出
Optional時,我們的代碼是這樣的User user = ..... if (user != null) { return user.getOrders(); } else { return Collections.emptyList(); }而有了
Optional后代碼如果寫成下面這樣,其實并沒有多大區(qū)別Optional<User> user = ...... if (user.isPresent()) { return user.getOrders(); } else { return Collections.emptyList(); } -
那么我們?nèi)绻_使用
Optional的獲取值的方法呢?就要提到
orElse和orElseGet了
用法
orElse
如果Optional實例有值則將其返回,否則返回orElse方法傳入的參數(shù)
public T orElse(T other)
參數(shù):
other,即需要被返回的值返回:當(dāng)只存在時返回值,不存在返回other(可以理解為自定義值,如字符串的內(nèi)容)
-
例子:
//調(diào)用工廠方法創(chuàng)建Optional實例 Optional<String> name = Optional.of("Dolores"); //創(chuàng)建一個空實例 Optional empty = Optional.ofNullable(null); //創(chuàng)建一個不允許值為空的空實例 Optional noEmpty = Optional.of(null);//如果值不為null,orElse方法返回Optional實例的值。 //如果為null,返回傳入的消息。 //輸出:Dolores System.out.println(name.orElse("There is some value!")); //輸出:There is no value present! System.out.println(empty.orElse("There is no value present!")); //拋NullPointerException System.out.println(noEmpty.orElse("There is no value present!");
orElseGet
orElseGet與orElse方法類似,區(qū)別在于得到的默認值。orElse方法將傳入的字符串作為默認值,orElseGet方法可以接受Supplier的實現(xiàn)用來生成默認值
public T orElseGet(Supplier<? extends T> other)
參數(shù):繼承
Supplier接口的other,當(dāng)值為null的時候返回返回:值存在返回值,值不存在返回
other異常:當(dāng)不允許值為空的情況(例如)下值為空時或
other無效拋NullPointerException-
例子:
//orElseGet與orElse方法類似,區(qū)別在于orElse傳入的是默認值, //orElseGet可以接受一個lambda表達式生成默認值。 //輸出:Dolores System.out.println(name.orElseGet(() -> ``"it's value"``)); //輸出:No value System.out.println(empty.orElseGet(() -> ``"No value"``)); //拋出NullPointerException System.out.println(noEmpty.orElseGet(() -> ``"it's value"``));
orElseThrow
如果有值則將其返回,否則拋出Supplier接口創(chuàng)建的異常。
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
throws X extends Throwable
-
參數(shù):
exceptionSupplier一個拋異常的實例化Supplier - 返回:當(dāng)前值或當(dāng)值為null拋出異常
-
異常:當(dāng)不允許值為空的時候以及
exceptionSupplier為空拋NullPointerException;值為空拋Supplier繼承的異常 - 例子:
try {
//orElseThrow與orElse方法類似。與返回默認值不同,
//orElseThrow會拋出lambda表達式或方法生成的異常
empty.orElseThrow(DemoException::new);
} catch (Throwable throwable) {
//輸出: Here is message
System.out.println(throwable.toString());
}
try {
o.orElseThrow(DemoException::new);
} catch (Throwable throwable) {
//輸出:Exception in thread "main" java.lang.NullPointerException的詳細信息
System.out.println(throwable.printStackTrace());
}
以下是自定義的DemoException
class DemoException extends Throwable {
public DemoException() {
super();
}
public DemoException(String msg) {
super(msg);
}
@Override
public String getMessage() {
return "Here is message";
}
}
總結(jié)
總的來說,orElse與orElseGet方法差不多,兩者都會返回定義的內(nèi)容,前者是字符串,后者是實現(xiàn)了Supplier的內(nèi)容;并且后者會在不允許值為空或other無效的情況拋NullPointerException異常