- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 747字
- 2020-10-30 18:10:32
1.3 filter、map和flatMap方法
流的轉換會產生一個新的流,它的元素派生自另一個流中的元素。我們已經看到了filter轉換會產生一個流,它的元素與某種條件相匹配。下面,我們將一個字符串流轉換為了只包含長單詞的另一個流:

filter的引元是Predicate<T>,即從T到boolean的函數。
通常,我們想要按照某種方式來轉換流中的值,此時,可以使用map方法并傳遞執行該轉換的函數。例如,我們可以像下面這樣將所有單詞都轉換為小寫:

這里,我們使用的是帶有方法引用的map,但是,通常我們可以使用lambda表達式來代替:

上面語句所產生的流中包含了所有單詞的首字母。
在使用map時,會有一個函數應用到每個元素上,并且其結果是包含了應用該函數后所產生的所有結果的流。現在,假設我們有一個函數,它返回的不是一個值,而是一個包含眾多值的流:

例如,letters("boat")的返回值是流["b","o","a","t"]。
注意:通過使用1.13節中的IntStream.range方法,我們實現這個方法可以優雅得多。
假設我們在一個字符串流上映射letters方法:

那么就會得到一個包含流的流,就像[...["y","o","u","r"],["b","o","a","t"],...]。為了將其攤平為字母流[..."y","o","u","r","b","o","a","t",...],可以使用flatMap方法而不是map方法:

注意:在流之外的類中你也會發現flatMap方法,因為它是計算機科學中的一種通用概念。假設我們有一個泛型G(例如Stream),以及將某種類型T轉換為G<U>的函數f和將類型U轉換為G<V>的函數g。然后,我們可以通過使用flatMap來組合它們,即首先應用f,然后應用g。這是單子論的關鍵概念。但是不必擔心,我們無須了解任何有關單子的知識就可以使用flatMap。
java.util.stream.Stream 8
·Stream<T>filter(Predicate<?super T>predicate)
產生一個流,它包含當前流中所有滿足斷言條件的元素。
·<R>Stream<R>map(Function<?super T,?extends R>mapper)
產生一個流,它包含將mapper應用于當前流中所有元素所產生的結果。
·<R>Stream<R>f latMap(Function<?super T,?extends Stream<?extends R>>mapper)
產生一個流,它是通過將mapper應用于當前流中所有元素所產生的結果連接到一起而獲得的。(注意,這里的每個結果都是一個流。)
- VMware View Security Essentials
- Twilio Best Practices
- Unity 2020 Mobile Game Development
- Python網絡爬蟲從入門到實踐(第2版)
- UI智能化與前端智能化:工程技術、實現方法與編程思想
- Java:Data Science Made Easy
- Node.js全程實例
- Learning Probabilistic Graphical Models in R
- Mastering Linux Security and Hardening
- Unity 2018 Augmented Reality Projects
- C++編程兵書
- C指針原理揭秘:基于底層實現機制
- UI設計基礎培訓教程(全彩版)
- 3D Printing Designs:Octopus Pencil Holder
- 你好!Java