上一篇小樂帶你們瞭解了Java8新特性之Stream,接下來將會繼續述說Java新特性之Optionaljava
Optional<T>類(java.util.Optional)是一個容器類,表明一個值存在或不存在,原來用null表示一個值不存在,如今Optional能夠更好的表達這個概念。而且能夠避免空指針異常。segmentfault
爲非null的值建立一個Optional,若是值爲null,則會拋出NullPointerExceptionapp
Optional<Integer> optional = Optional.of(13); System.out.println(optional)
爲指定的值建立一個Optional,若是指定的值爲null,則返回一個空的Optional。函數
Optional<String> optional2 = Optional.ofNullable(null); System.out.println(optional2); optional2 = Optional.ofNullable("aaa"); System.out.println(optional2);
若是值存在返回true,不然返回false。spa
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());
若是Optional有值則將其返回,不然拋出NoSuchElementException。指針
optional2 = Optional.ofNullable("aaa"); System.out.println(optional2); System.out.println(optional2.isPresent()); System.out.println(optional2.get());
若是Optional實例有值則爲其調用consumer,不然不作處理 。隱士地其中進行了null判斷。code
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())); }
若是有值則將其返回,不然返回指定的其它值。接口
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("默認字符串")); }
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)); }
若是有值則將其返回,不然拋出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()))); }
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")); }); }
若是有值,爲其執行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("還會沒有嗎")); }
若是有值而且知足斷言條件返回包含該值的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新特性,請繼續關注,轉載請說明出處和做者。