Stream之高階函式

Seven發表於2021-10-09

上回文說到了有關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聚合函式

相關文章