上一篇小樂帶大家瞭解了Java新特性之Stream,接下來將會繼續述說Java新特性之Optional Optional<T>類(java.util.Optional)是一個容器類,代表一個值存在或不存在,原來用null表示一個值不存在,現在Optional可以更好的表達這個概念。並且可以避免空指針 ...
上一篇小樂帶大家瞭解了Java新特性之Stream,接下來將會繼續述說Java新特性之Optional
Optional<T>類(java.util.Optional)是一個容器類,代表一個值存在或不存在,原來用null表示一個值不存在,現在Optional可以更好的表達這個概念。並且可以避免空指針異常。
1、of
為非null的值創建一個Optional,如果值為null,則會拋出NullPointerException
Optional<Integer> optional = Optional.of(13);
System.out.println(optional)
2、ofNullable
為指定的值創建一個Optional,如果指定的值為null,則返回一個空的Optional。
Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
3、isPresent
如果值存在返回true,否則返回false。
Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
System.out.println(optional2.isPresent());
optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
System.out.println(optional2.isPresent());
4、get
如果Optional有值則將其返回,否則拋出NoSuchElementException。
optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
System.out.println(optional2.isPresent());
System.out.println(optional2.get());
5、ifPresent
如果Optional實例有值則為其調用consumer,否則不做處理 。隱士地其中進行了null判斷。
public static void main(String[] args) {
String str1 = "hello";
String str2 = null;
Optional<String> optional1 = Optional.ofNullable(str1);
Optional<String> optional2 = Optional.ofNullable(str2);
optional1.ifPresent(str->System.out.println(str.length()));
optional2.ifPresent(str-> System.out.println(str.length()));
}
6、orElse
如果有值則將其返回,否則返回指定的其它值。
public static void main(String[] args) {
String str1 = "hello";
String str2 = null;
Optional<String> optional1 = Optional.ofNullable(str1);
Optional<String> optional2 = Optional.ofNullable(str2);
System.out.println(optional1.orElse("預設字元串"));
System.out.println(optional2.orElse("預設字元串"));
}
7、orElseGet
orElseGet與orElse方法類似,區別在於得到的預設值。orElse方法將傳入的一個值作為預設值,orElseGet方法可以接受Supplier介面的實現用來生成預設值
public static void main(String[] args) {
Integer i = 20;
Optional<Integer> op = Optional.ofNullable(i);
System.out.println(op.orElseGet(()->0));
System.out.println(Optional.ofNullable(null).orElseGet(()->0));
}
8、orElseThrow
如果有值則將其返回,否則拋出supplier介面創建的異常。
public static void main(String[] args) {
// 自己指定異常
System.out.println((Optional.ofNullable("a").orElseThrow(()->new IndexOutOfBoundsException())));
System.out.println((Optional.ofNullable(null).orElseThrow(()->new IndexOutOfBoundsException())));
}
9、map
map處理有值的情況,如果有值,則對其執行調用map參數中的函數得到返回值,否則返回空Optional。
public static void main(String[] args) {
List<String> list = new ArrayList<String>(){
{
add("aaa");
add("bbb");
add(null);
}
};
list.stream().forEach(temp ->{
Optional<String> opt = Optional.ofNullable(temp);
System.out.println(opt.map(n -> {
return n.toUpperCase();
}).orElse("Nothing"));
});
// 簡寫為如下形式
list.stream().forEach(temp->{
System.out.println(Optional.ofNullable(temp).map(n->n.toUpperCase()).orElse("Nothing"));
});
}
10、flatMap
如果有值,為其執行mapping函數返回Optional類型返回值,否則返回空Optional。flatMap與map(Funtion)方法類似,區別在於flatMap中的mapper返回值必須是Optional。調用結束時,flatMap不會對結果用Optional封裝。 可以將內容
public static void main(String[] args) {
Optional<String> opt1 = Optional.ofNullable("aaa");
Optional<String> opt2 = Optional.ofNullable(null);
System.out.println(opt1.flatMap(n->{
return Optional.ofNullable(n.toUpperCase());
}).orElse("還會沒有嗎"));
System.out.println( opt2.flatMap(n->{
return Optional.ofNullable(n.toUpperCase());
}).orElse("還會沒有嗎"));
}
11、filter
如果有值並且滿足斷言條件返回包含該值的Optional,否則返回空Optional。
public static void main(String[] args) {
Optional<String> opt1 = Optional.ofNullable("aabbbbaa");
Optional<String> opt2 = Optional.ofNullable(null);
System.out.println(opt1.filter(value->value.length()>6));
System.out.println(opt2.filter(value->value.length()>6));
}
好了,Java8新特性之Optional就介紹到這裡了,接下去小樂將會繼續帶大家瞭解Java8新特性,請繼續關註,轉載請說明出處和作者。