JDK8主要新特性介紹(二)

1.6  類庫新特性

       java.util.stream 類庫包新特性

       ●java.util.Optional 類新特性

       ●java.util.Base64 類新特性

       ●Java.time 類新特性

       ●其它常用類新增特性

       ●HashMap類性能提升

1.6.1 java.util.stream 類庫包新特性
Stream流的特性
           定 義:支持數據處理操作的源生成的元素序列。它並非是數據結構,也不是容器,而是一個過程.
 引入的原因:1.聲明性方式處理數據集合   2.透明地並行處理,提高性能
     重要特點:1. 內部迭代                           2. 數據流(類似管道)傳輸

Stream數據類型

              

Stream流操作的分類:
         1.中間操作:可以連接起來的流操作
         2.終端操作:關閉流的操作,觸發流水線執行並關閉它。
特        點:一個流的操作,沒有終端操作 ,則該流中的任何中間操作操作都不會執行。

              

Stream流的使用:
          一個數據源(如源集合)來執行一個操作(如映射).
          一箇中間操作鏈(如篩選),形成一條流的流水線.
          一個終端操作(如歸約),執行流水線,並能生成結果.

         

流的構建:

         

 Stream流典型的接口方法:

      1 filter  (Predicate<? super T> predicate); 用於過濾、篩選   2  distinct(); 去重  [會依賴hasCode和equals]

                          

        3 map (Function<? super T ,  ? extends R> mapper);
           * 對於Stream中包含的元素使用給定的轉換函數進行轉換操作,把所有的返回值組成新的流。
           * 傳入User對象(User流),提取裏面的所有name屬性,轉換爲一個Strea,的流
           * 新生成的Stream只包含轉換生成的元素。

             

  Stream 流 - 收集數據:

        對流調用 collect 方法將對流中的元素觸發歸約操作(由 Collector 來參數化), 將流中的元素累計成一個彙總結果。Collectors 實用類提供了許多靜態工廠方法,用來創建常見收集器的實例.
       Collectors.toList() 返回類型List<T> ,把流中的所有項目收集到一個List。
       Collectors.toSet() 返回類型Set<T>, 把流中的所有項目收集到一個Set。
       Collectors.toCollection(Supplier collecttionFactory)返回類型Collection<T>, 把流中的所有項目收集到給定的供應源創建的集合。
       Collectors.counting()方法返回的收集器,查看集合數量.如:menu.stream().collect(counting());
       Collectors.maxBy(Comparator<? super T> comparator) 根據比較器,獲取最大值;
             如:userLists.stream().collect(maxBy(Comparator.comparing(User::getAge)));
       Collectors.minBy(Comparator<? super T> comparator) 根據比較器,獲取最小值;
       Collectors.summingInt/summingDouble/summingLong() 彙總對象映射爲求和的int/Double/Long函數;
             如:userLists.stream().collect(summingInt(User::getAge));
       Collectors.averagingInt/averagingDouble/averagingLong() 彙總對象映射爲平均值的int/Double/Long函數;
             如:userLists.stream().collect(averagingInt(User::getAge));
        Collectors.joining()返回的收集器會把對流中的每一個對象應用toString()後連接成一個字符串,內部使用StringBuilder;重載:參數是分隔符. 如:userLists.stream().map(User::getAge).collect(joining(","));

      

  Stream並行流:

             

1.6.2 java.util.Optional 類新特性

       Optional被定義爲一個簡單的容器,其值可能是null或者不是null,Java 8之前一般某個函數應該返回非空對象但是偶爾卻可能返回了null,而在Java 8 以後,不推薦你返回null而是返回Optional。

        java.util.Optional<T>,對可能缺失的值建模.引入的目的並非是要消除每一個 null引用,而是幫助你更好地設計出普適的 API.

 Optional的優點
       1)顯式的提醒你需要關注null的情況,對程序員是一種字面上的約束
       2)將平時的一些顯式的防禦性檢測給標準化了,並提供一些可串聯操作
       3)解決null會導致疑惑的概念

Optional對象的創建
      empty()          聲明一個空的Optional,eg:Optional<User> optU =  Optional. empty();
      of(T value)     爲非null的值創建一個Optional.通過工廠方法創建Optional類。創建對象時傳入的參數不能爲nul,如果爲null,則拋出NullPointerException.
      ofNullable(T value)  爲指定的值創建一個Optional,如果指定的值爲null,則返回一個空的Optional,可以接受參數爲null的情況。

常用 方法
      isPresent()     如果值存在返回true,否則返回false。
      get()              如果Optional有值則將其返回,否則拋出異常 NoSuchElementException。
      ifPresent(Consumer<? super T> consumer) 如果Optional實例有值則爲其調用consumer,否則不做處理
      orElse(T other) 如果Optional實例有值則將其返回,否則返回orElse方法傳入的參數。即參數other爲默認返回值,eg:myValue.orElse("傳入的參數value!")
      orElseGet(Supplier<? extends T> other) 如果Optional實例有值則將其返回,否則調用other Lambda的get方法返回默認值,eg:myValue.orElseGet(() -> "Default Value")
      orElseThrow(Supplier<? extends X> exceptionSupplier)如果有值則將其返回,否則拋出supplier接口創建的異常。eg:

public static void main(String[] args) {
    try { //orElseThrow與orElse方法類似。與返回默認值不同,
          //orElseThrow會拋出lambda表達式或方法生成的異常
          empty.orElseThrow(ValueAbsentException::new);
         } catch (Throwable ex) {
           //輸出: No value present in the Optional instance
           System.out.println(ex.getMessage());
     }
}

class ValueAbsentException extends Throwable {
    public ValueAbsentException() {super();}
    public ValueAbsentException(String msg) {super(msg); }
    @Override
    public String getMessage() {
       return "No value present in the Optional instance"; 
    }
}

    map(Function<? super T,? extends U> mapper)  如果有值,則對其執行調用mapping函數得到返回值。如果返回值不爲null,則創建包含mapping返回值的Optional作爲map方法返回值,否則返回空Optional。map方法用來對Optional實例的值執行一系列操作。通過一組實現了Function接口的lambda表達式傳入操作。eg:Optional<String> upperName = myValue.map((value) -> value.toUpperCase());
    flatMap(Function<? super T,Optional<U>> mapper)    如果有值,爲其執行mapping函數返回Optional類型返回值,否則返回空Optional。flatMap與map(Funtion)方法類似,區別在於flatMap中的mapper返回值必須是Optional。調用結束時,flatMap不會對結果用Optional封裝。    
   filter(Predicate<? super T> predicate)  如果有值並且滿足斷言條件返回包含該值的Optional,否則返回空Optional。filter個方法通過傳入限定條件對Optional實例的值進行過濾。對於filter函數我們可以傳入實現了Predicate接口的lambda表達式。

1.6.3 java.util.Base64 類新特性

      Base64已經是 JDK的標準類庫,支持Base64的編解碼。

                  

1.6.4 Java.time 類新特性

                  

1.6.5 其它常用類新增特性

                          

1.6.6 HashMap類性能提升

                          

                            

1. 7 JAVA虛擬機(JVM)新特性

                           

   1. 8 新增工具特性

        jjs 工具:Nashorm 引擎,可以用來解析javascripts腳本                 

        ●Jdeps工具:java類的依賴分析工具。

 

ps:https://www.journaldev.com/2752/java-8-interface-changes-static-method-default-method

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章