Stream之高級函數

上迴文說到了有關Stream一些數學函數的用法、今天來說下Stream一些高級的函數用法,這些函數在日常工作中也是必不可少的,測試數據還是引用上一篇的數據。

Map

這個方法我個人稱之為轉換函數,把一些原始數據轉換成我想要的數組結構,它返回的是Stream對象,通過配置collection方法使用,下面來看一栗子。老師要統計我們班的姓氏列表

/**
* 給一份班級的姓氏表
*/
@Test
public void test_map() {
  List<String> lastNameCol = this.book.getKids().stream().
    map(Child::getLastName)
    .distinct()
    .collect(Collectors.toList());
}

配合collect方法一起使用,基本能解決日常工作需要。

peek

這個方法和forEach函數很像,唯一的區別就是返回值不一樣,通過一個栗子來看下peek的用法。把小朋友們的年齡變成分的格式

/**
* 把小朋友們的年齡變成分的格式給我
*/
@Test
public void test_peek() {
  List<Child> newKids =  this.book.getKids().stream().
    peek(i -> i.setAge((int) (i.getAge() * 100)))
    .collect(Collectors.toList());
}

其實用forEach也用實現,但應用的場景好像並不對味。forEach函數沒有返回值,意味著是調用鏈中最後的方法調用。可以針對業務場景選擇具體的方法調用。

Sorted

一個需要排序的集合,這種需要在工作中太經常出現了!有的時候資料庫並不能滿足我們的業務排序功能,那麼就要手動的對源數據進行排序操作,還是通過一栗子來看下按年齡大小排序(升序)

/**
* 按年齡大小排序 升序
*/
@Test
public void test_sorted() {
  this.book.getKids().stream().
    sorted(Comparator.comparing(Child::getAge))
    .forEach(i -> System.out.println(i.getAge()));
}

默認的是升序,可以通過指定排序方式Comparator.comparing(Child::getAge).reversed()來降序操作。還可以通過多個維度的欄位進行排序,寫多個sorted或者在一個sorted里調用thenComparing方法指定其他排序邏輯。

groupBy

按什麼分組,這個在日誌工作中也經常的運用到,一些點餐頁面的首頁(按商品分類分組),按地區分組,等。一個栗子按姓氏分組

@Test
public void test_groupBy() {
  Map<String, List<Child>> groupByLastName = this.book.getKids().stream().
    collect(Collectors.groupingBy(Child::getLastName));
}

用法很簡單啊,返回的是一個Map<String, List<Child>>的集合對象。

flatMap

flatMap方法也是經常的用的到,我主要是拿它來合併多個數組,比如上面那個栗子,按姓氏分完組後,那如何再合併到一個集合呢?如果沒有flatMap,經常的做法就是對groupByLastNameloop處理。那麼再看flatMap的用法

/**
 * flatMap多給數組合併成一個數組
*/
public void test_flatMap() {
  List<Child> kids = groupByLastName.values().stream()
    .flatMap(Collection::stream)
    .collect(Collectors.toList());
}

經過這和以一處理,就可以把剛才分完組後的數據結構又變成了原來的數組。

程式碼在GitHub

其它相關

➢ Java8,Stream之filter簡單介紹

➢ Stream聚合函數