Java 8 Stream Api 中的 map和 flatMap 操做

1.前言

Java 8 提供了很是好用的 Stream API ,能夠很方便的操做集合。今天咱們來探討兩個 Stream 中間操做 map(Function mapper)flatMap(Function > mapper)html

2. map 操做

map 操做是將流中的元素進行再次加工造成一個新流。這在開發中頗有用。好比咱們有一個學生集合,咱們須要從中提取學生的年齡以分析學生的年齡分佈曲線。放在 Java 8 以前 咱們要經過新建一個集合而後經過遍歷學生集合來消費元素中的年齡屬性。如今咱們經過很簡單的流式操做就完成了這個需求。java

示意圖:api

stream map 操做

對應的僞代碼:app

// 僞代碼
 List<Integer> ages=studentList.stream().map(Student::getAge).collect(Collectors.toList());複製代碼

3. flatMap 操做

經過上面的例子,map 操做應該很是好理解。那麼 flatMap 是幹嗎的呢? 這樣咱們把上面的例子給改一下,若是是以班級爲單位,提取全部班級下的全部學生的年齡以分析學生的年齡分佈曲線。這時咱們使用上面的方法還行得通嗎?spa

List<List<Student>> studentGroup= gradeList.stream().map(Grade::getStudents).collect(Collectors.toList());複製代碼

經過上面的一頓操做,咱們只能獲得每一個班的學生集合的集合 List > 。 咱們還須要嵌套循環才能獲取學生的年齡數據,十分不便。若是咱們能返回所有學生的集合 List 就方便多了。 沒錯!flatMap 能夠搞定!3d

// flatMap 提取 List<Students>  map 提取年齡
 List<Integer> ages = grades.stream().flatMap(grade -> grade.getStudents().stream()).map(Student::getAge).collect(Collectors.toList());複製代碼

正如上面的僞代碼所示,咱們使用 flatMap 將全部的學生匯聚到一塊兒。而後再使用 map 操做提取年齡。 flatMap 不一樣於 map 地方在於 map 只是提取屬性放入流中,而 flatMap 先提取屬性放入一個比較小的流,而後再將全部的流合併爲一個流。有一種 「積少成多」 的感受。code

再畫一張圖來加深理解:cdn

flatmap

4. 總結

map 操做和 flatMap 操做一旦你熟悉了,能夠很是簡便地解決一些數據流的操做問題。擴展一下知識,其實Java 8 中 不光 Stream 中存在這兩種操做,其實 Optional 中也存在這兩種操做,做用都差很少。htm

關注公衆號:Felordcn獲取更多資訊blog

我的博客:https://felord.cn

相關文章
相關標籤/搜索