Java 8 提供了很是好用的 Stream API ,能夠很方便的操做集合。今天咱們來探討兩個 Stream 中間操做 map(Function
mapper)
和 flatMap(Function
> mapper)
html
map
操做是將流中的元素進行再次加工造成一個新流。這在開發中頗有用。好比咱們有一個學生集合,咱們須要從中提取學生的年齡以分析學生的年齡分佈曲線。放在 Java 8 以前 咱們要經過新建一個集合而後經過遍歷學生集合來消費元素中的年齡屬性。如今咱們經過很簡單的流式操做就完成了這個需求。java
示意圖:api
對應的僞代碼:app
// 僞代碼
List<Integer> ages=studentList.stream().map(Student::getAge).collect(Collectors.toList());複製代碼
經過上面的例子,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
map
操做和 flatMap
操做一旦你熟悉了,能夠很是簡便地解決一些數據流的操做問題。擴展一下知識,其實Java 8 中 不光 Stream 中存在這兩種操做,其實 Optional
中也存在這兩種操做,做用都差很少。htm
關注公衆號:Felordcn獲取更多資訊
blog