官术网_书友最值得收藏!

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應用于當前流中所有元素所產生的結果連接到一起而獲得的。(注意,這里的每個結果都是一個流。)

主站蜘蛛池模板: 堆龙德庆县| 龙泉市| 北辰区| 龙江县| 晋州市| 古蔺县| 罗甸县| 湘西| 如东县| 大竹县| 巨鹿县| 财经| 高平市| 长白| 固安县| 侯马市| 府谷县| 枣强县| 合作市| 共和县| 绥德县| 嘉祥县| 东港市| 贵南县| 绥宁县| 大连市| 社旗县| 新余市| 新沂市| 军事| 德安县| 冕宁县| 太湖县| 朝阳区| 芜湖县| 敦煌市| 桦南县| 大同市| 阜南县| 西峡县| 柳州市|