Java1.8新特性學習

我的世界只有你發表於2018-08-06

Java1.8新特性學習

第一部分:Optional

簡單介紹Optional的API

  • empty:返回一個空的Optional物件
  • of:入參:Object,返回一個Optional物件,如果入參是一個null,就會報空指標異常
  • ofNullable:入參Object,返回一個Optional物件,如果入參是一個null,會返回一個空的Optional物件
  • get: 如果Optional物件中有值就返回相應的值,如果沒有值就報空指標異常
  • orElse:入參:Object,如果Optional物件中有個值得話,就返回這個值,不會返回入參;如果沒有值,就會返回入參

    測試程式碼:
    Optional<Object> empty = Optional.ofNullable(null);
    System.out.println("empty:"+empty.orElse("李四"));
    Optional<String> optional = Optional.ofNullable("張三");
    System.out.println("optional:"+optional.orElse("zhangsan"));
    結果:
    empty:李四
    optional:張三
    
  • orElseGet :入參Supplier,如果optional物件中有資料,就會返回這個值,不會返回入參;如果沒有值,就會返回入參

     //測試orElseGet功能
    System.out.println("==================測試orElseGet功能======================");
    Optional<Object> empty_orElseGet = Optional.ofNullable(null);
    System.out.println("empty:"+empty.orElseGet(()->"李四"));
    Optional<String> optional_orElseGet = Optional.ofNullable("張三");
    System.out.println("optional:"+optional.orElseGet(()->"zhangsan"));
    結果:
    empty:李四
    optional:張三
    原始碼:
    public T orElseGet(Supplier<? extends T> other) {
    return value != null ? value : other.get();
    }
    
  • orElseThrow:入參:指定一個異常;如果optional物件中有資料,就會返回這個值,不會報異常資訊,如果沒有值,就會報指定的異常資訊

    //測試orElseThrow功能
    System.out.println("==================測試orElseThrow功能======================");
    Optional<String> optional_orElseThrow = Optional.ofNullable("張三");
    System.out.println("optional_orElseThrow:"+optional.orElseThrow(RuntimeException::new));
    Optional<Object> empty_orElseThrow = Optional.ofNullable(null);
    System.out.println("empty_orElseThrow:"+empty.orElseThrow(RuntimeException::new));
    
  • filter:入參Predicate,如果optional中的值滿足條件,就返回一個含有這個值得optional物件,否則返回一個空的option物件

    System.out.println("==================測試filter功能======================");
    Optional<String> stringOptional = Optional.ofNullable("zhangsan");
    System.out.println(stringOptional.filter(temp->temp.length()>5));
    stringOptional=Optional.empty();
    System.out.println(stringOptional.filter(temp->temp.length()>5));
    結果:
    zhangsan
    Optional.empty
    
  • filter注意事項:Optional中的filter方法和Stream中的filter方法是有點不一樣的,Stream中的filter方法是對一堆元素進
    行過濾,而Optional中的filter方法只是對一個元素進行過濾,可以把Optional看成是最多隻包含一個元素
    的Stream

  • map:如果Option物件中有值可以對其進行修改,.返回值是一個含有這個值得Optional物件

    //測試map功能
    System.out.println("==================測試map功能======================");
    Optional<String> stringOptional_map = Optional.ofNullable("zhangsan");
    System.out.println(stringOptional_map.map(temp->temp.toUpperCase()).orElse("失敗"));
    stringOptional_map=Optional.empty();
    System.out.println(stringOptional.map(temp->temp.toUpperCase()).orElse("失敗"));
    結果:
    ZHANGSAN
    失敗
    
  • flagMap:如果建立的Optional中的值存在,就對該值執行提供的Function函式呼叫,返回一個Optional型別的值,否
    則就返回一個空的Optional物件.flatMap與map(Funtion)方法類似,區別在於flatMap中的mapper返回
    值必須是Optional,map方法的mapping函式返回值可以是任何型別T。呼叫結束時,flatMap不會對結果
    用Optional封裝。

    System.out.println("==================測試flagMap功能======================");
    Optional<String> stringOptional_flagMap = Optional.ofNullable("zhangsan");
    System.out.println(stringOptional_flagMap.flatMap(temp-> Optional.of("list")));
    stringOptional_flagMap=Optional.ofNullable(null);
    System.out.println(stringOptional_flagMap.flatMap(temp-> Optional.of("list")));
    
  • ifPresent://ifPresent方法的引數是一個Consumer的實現類,Consumer類包含一個抽象方法,該抽象方法對傳入的值進行處理,只處理沒有返回值。

    Optional stringOptional = Optional.of(“zhangsan”); 
    stringOptional.ifPresent(e-> System.out.println(“我被處理了。。。”+e));
    

第二部分:Lambda表示式

Lambda 基本語法

(parameters) -> expression
或
(parameters) ->{ statements; }

- 做幾點說明:
1. 可選的引數宣告:可以宣告引數的型別,編輯器可以統一識別
2. 可選的引數圓括號:一個引數無需定義圓括號,但多個引數需要定義圓括號。
3. 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
4. 可選的返回關鍵字:如果主體只有一個表示式返回值則編譯器會自動返回值,大括號需要指定明表示式返回了一個數值。

第一個例項:開啟一個執行緒

//第一個例子,開啟一個執行緒
new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(addNum(1,2));
        }
    }).start();
    new Thread(()-> System.out.println(addNum(1,2))).start();
//私有方法
private static int addNum(int arg1,int arg2){
    return arg1+arg2;
}

第二個例子:使用表示對集合進行迭代

//對集合進行迭代
    List<Integer> list = list();
    for (Integer integer : list) {
        System.out.println(integer);
    }

    list.forEach(System.out::println);
//生成一個隨機數集合
private static List<Integer> list (){
    List<Integer> listNum = new ArrayList<>();
    for (int i= 0 ; i<10 ;i++){
        int  random = new Random().nextInt(100);
        listNum.add(random);
    }
    return listNum;
}

第三個例子:使用表示式filter過濾

    ** List<String> list = stringList();
    list.forEach(System.out::println);
    //過濾的條件
    Predicate<String>startWith=(n)->n.length()>3;
    list.stream().filter(startWith).collect(Collectors.toList()).forEach(System.out::println);**
//隨機生成一個字串
private static String string(){

    String str ="ABCDEFGHIJKMNOPQRSTUVWSYZ";
    StringBuilder stringBuilder = new StringBuilder();
    int r = new Random().nextInt(5);
    for (int i = 0; i <r+1 ; i++) {
       int random = new Random().nextInt(str.length());
        char charAt = str.charAt(random);
        stringBuilder.append(charAt);
    }
    return stringBuilder.toString();
}
//生成一個字元創的集合
private static List<String> stringList(){
    List<String> list = new ArrayList<>();
    for (int i = 0; i <10 ; i++) {
        list.add(string());
    }
    return list;
}

相關文章