上回文說到了有關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
,經常的做法就是對groupByLastName
loop處理。那麼再看flatMap
的用法
/**
* flatMap多給陣列合併成一個陣列
*/
public void test_flatMap() {
List<Child> kids = groupByLastName.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
經過這和以一處理,就可以把剛才分完組後的資料結構又變成了原來的陣列。