Java8新特性之Optional

上一篇小樂帶你們瞭解了Java8新特性之Stream,接下來將會繼續述說Java新特性之Optionaljava

圖片描述

Optional<T>類(java.util.Optional)是一個容器類,表明一個值存在或不存在,原來用null表示一個值不存在,如今Optional能夠更好的表達這個概念。而且能夠避免空指針異常。segmentfault

一、of

爲非null的值建立一個Optional,若是值爲null,則會拋出NullPointerExceptionapp

Optional<Integer> optional = Optional.of(13);
System.out.println(optional)

二、ofNullable

爲指定的值建立一個Optional,若是指定的值爲null,則返回一個空的Optional。函數

Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);

三、isPresent

若是值存在返回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());

四、get

若是Optional有值則將其返回,不然拋出NoSuchElementException。指針

optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
System.out.println(optional2.isPresent());
System.out.println(optional2.get());

五、ifPresent

 

若是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()));
}

六、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("默認字符串"));
}

七、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));
}

八、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())));
}

九、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"));
    });
}

十、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("還會沒有嗎"));
}

十一、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新特性,請繼續關注,轉載請說明出處和做者。

相關文章
相關標籤/搜索