Java8特性——Stream與lambda總結

什麼是Stream?

  1. Stream 作爲 Java 8 的一大亮點,它與 java.io 包裏的 InputStream 和 OutputStream 是完全不同的概念。
  2. Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注於對集合對象進行各種非常便利、高效的聚合操作(aggregate operation),或者大批量數據操作 (bulk data operation)。同時它提供串行和並行兩種模式進行匯聚操作。
  3. Stream是有關算法和計算的,它更像一個高級版本的 Iterator。原始版本的 Iterator,用戶只能顯式地一個一個遍歷元素並對其執行某些操作;高級版本的 Stream,用戶只要給出需要對其包含的元素執行什麼操作,比如 “過濾掉長度大於 10 的字符串”、“獲取每個字符串的首字母”等,Stream 會隱式地在內部進行遍歷,做出相應的數據轉換
  4. Stream 就如同一個單向的,不可往復的迭代器(Iterator),數據只能遍歷一次,遍歷過一次後就用盡了,就好比流水從面前流過,一去不復返。

而和迭代器又不同的是,Stream 可以並行化操作,迭代器只能命令式地、串行化操作。顧名思義,當使用串行方式去遍歷時,每個 item 讀完後再讀下一個 item。而使用並行去遍歷時,數據會被分成多個段,其中每一個都在不同的線程中處理,然後將結果一起輸出。Stream 的並行操作依賴於 Java7 中引入的 Fork/Join 框架(JSR166y)來拆分任務和加速處理過程。

 

構造流的幾種常見方法:

// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
// 3. Collections
List<String> list = Arrays.asList(strArray);
stream = list.stream();

收集器:

    將數據收集進一個列表:
                              List 轉 Map:

第一種: 取list中某2個字段作爲Map的K,V

public Map<Long, String> getIdNameMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsername));
}

 

第二種:將id和實體Bean做爲K,V

public Map<Long, Account> getIdAccountMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getId, account -> account));
}

或者這樣寫:

public Map<Long, Account> getIdAccountMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getId, Function.identity()));
}

account -> account是一個返回本身的lambda表達式,後面的使用Function接口中的一個默認方法代替,使整個方法更簡潔優雅。

 

注:  lambda表達式

lambda表達式就是一種新的語法,我們可以把 Lambda 表達式理解爲是一段可以傳遞的代碼(將代碼像數據一樣進行傳遞)。

 Lambda 表達式的基礎語法:Java8中引入了一個新的操作符 "->" 該操作符稱爲箭頭操作符或 Lambda 操作符

箭頭操作符將 Lambda 表達式拆分成兩部分:
左側:Lambda 表達式的參數列表
右側:Lambda 表達式中所需執行的功能, 即 Lambda 體

方法引用:使用操作符 “::” 將類(或對象) 與 方法名分隔開來。
如下三種主要使用情況:
對象::實例方法名
類::靜態方法名
類::實例方法名

     Function.identity()

Function接口中的方法: Function.identity()返回一個輸出跟輸入一樣的Lambda表達式對象

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