上回文說到了有關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());
}
經過這和以一處理,就可以把剛才分完組后的數據結構又變成了原來的數組。