Java8函數(shù)式編程:3.10進(jìn)階練習(xí):map和filter實(shí)現(xiàn)

  1. 只用reduce 和Lambda 表達(dá)式寫出實(shí)現(xiàn)Stream 上的map 操作的代碼害捕,如果不想返回Stream拷邢,可以返回一個List哩俭。
// reduce實(shí)現(xiàn)map
private <T, R> Stream<R> map(Stream<T> stream, Function<T, R> fun) {
    return stream.reduce(new ArrayList<R>().stream(),  // Stream<R>是reduce參數(shù)的的U
            (u, t) -> Stream.concat(u, Stream.of(fun.apply(t))),
            (a, b) -> Stream.concat(a, b));
}
// 測試方法
// Artist(String name, String nation)
@Test
public void test23() {
    System.out.println(
        map(Stream.of(
                new Artist("a", "aaa"),
                new Artist("b", "bbb"),
                new Artist("c", "ccc")
        ), t -> t.getNation()).collect(Collectors.toList())
    ); // [aaa,bbb,ccc]
}

  1. 只用reduce 和Lambda 表達(dá)式寫出實(shí)現(xiàn)Stream 上的filter 操作的代碼震放,如果不想返回Stream筷厘,可以返回一個List。
// reduce實(shí)現(xiàn)filter
private <T> Stream<T> filter(Stream<T> stream, Predicate<T> pre) {
    return stream.reduce(new ArrayList<T>().stream(),   // Stream<T>是reduce的U
            (u, t) -> {
                if (pre.test(t))
                    return Stream.concat(u, Stream.of(t));
                return u;
            },
            (a, b) -> Stream.concat(a, b)
    );
}
// 測試方法
@Test
public void test24() {
    System.out.println(
            filter(Stream.of(
                    new Artist("a", "aaa"),
                    new Artist("b", "bb"),
                    new Artist("c", "c")
            ), t -> t.getNation().length() >= 2).collect(Collectors.toList())
    );
} // [Artist("a", "aaa"), Artist("b", "bb")]

后話前普,函數(shù)式編程寫起來是挺爽肚邢,寫完了會有種看不懂的感覺... 慢慢習(xí)慣就好。關(guān)鍵是reduce方法的使用拭卿,下面給出我的看法:
reduce方法有3個:

//1. 
Optional<T> reduce(BinaryOperator<T> accumulator);
/*
常規(guī)的累計計算器骡湖,參數(shù)泛型和返回值泛型相同,
具體的累計計算規(guī)則源代碼注釋已經(jīng)給出峻厚,
將stream第一個元素作為初始值响蕴,然后和第二個元素累計計算,
結(jié)果再次作為初始值惠桃,再和第三個元素累計計算浦夷,以此類推:

boolean foundAny = false;
T result = null;
for (T element : this stream) {
    if (!foundAny) {
        foundAny = true;
        result = element;
    }
    else
        result = accumulator.apply(result, element);
}
return foundAny ? Optional.of(result) : Optional.empty();
*/
//2. 
T reduce(T identity, BinaryOperator<T> accumulator);
/*
具有初始值的累計計算器,和上面的reduce類似辜王,
只是初始值永遠(yuǎn)固定不變劈狐,均為 identity,
并且參數(shù) identity誓禁、accumulator 的泛型相同懈息,與返回值泛型亦相同
*/
//3.
<U> U reduce(U identity,
             BiFunction<U, ? super T, U> accumulator,
             BinaryOperator<U> combiner);
/*
累加器帶有3個參數(shù)肾档,前兩個參數(shù)和上面的reduce含義相同摹恰,
需要注意的是 identity 的泛型和返回值的泛型相同辫继,
而 accumulator 的函數(shù)接口變?yōu)榱?BiFunction,并且支持兩種泛型俗慈,可以和返回值泛型相同姑宽,也可不同,
上面實(shí)現(xiàn) map 方法就有兩中泛型參數(shù)闺阱,U 是 Stream<R>炮车,T 就是 Artist,
最后一個參數(shù) combiner酣溃,貌似是和并行有關(guān)瘦穆,大概是并行執(zhí)行后結(jié)果如何合并的方法,這里暫時用 concat 合并赊豌,后面再研究
*/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扛或,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碘饼,更是在濱河造成了極大的恐慌熙兔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艾恼,死亡現(xiàn)場離奇詭異住涉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钠绍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門舆声,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柳爽,你說我怎么就攤上這事纳寂。” “怎么了泻拦?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵毙芜,是天一觀的道長。 經(jīng)常有香客問我争拐,道長腋粥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任架曹,我火速辦了婚禮隘冲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绑雄。我一直安慰自己展辞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布万牺。 她就那樣靜靜地躺著罗珍,像睡著了一般洽腺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上覆旱,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天蘸朋,我揣著相機(jī)與錄音,去河邊找鬼扣唱。 笑死藕坯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的噪沙。 我是一名探鬼主播炼彪,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼正歼!你這毒婦竟也來了霹购?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤朋腋,失蹤者是張志新(化名)和其女友劉穎齐疙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旭咽,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贞奋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了穷绵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轿塔。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仲墨,靈堂內(nèi)的尸體忽然破棺而出勾缭,到底是詐尸還是另有隱情,我是刑警寧澤目养,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布俩由,位于F島的核電站,受9級特大地震影響癌蚁,放射性物質(zhì)發(fā)生泄漏幻梯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一努释、第九天 我趴在偏房一處隱蔽的房頂上張望碘梢。 院中可真熱鬧,春花似錦伐蒂、人聲如沸煞躬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恩沛。三九已至在扰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間复唤,已是汗流浹背健田。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工烛卧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佛纫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓总放,卻偏偏與公主長得像呈宇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子局雄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理甥啄,服務(wù)發(fā)現(xiàn),斷路器炬搭,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 第一章 為什么要關(guān)心Java 8 使用Stream庫來選擇最佳低級執(zhí)行機(jī)制可以避免使用Synchronized(同...
    謝隨安閱讀 1,482評論 0 4
  • Java8 in action 沒有共享的可變數(shù)據(jù)蜈漓,將方法和函數(shù)即代碼傳遞給其他方法的能力就是我們平常所說的函數(shù)式...
    鐵牛很鐵閱讀 1,213評論 1 2
  • 原文http://www.codeceo.com/article/learn-java-lambda.html L...
    與我常在1053閱讀 1,121評論 1 7
  • 時代篇 青蔥歲月(上) 那是所有人一生中最美好的歲月,美好之處卻又不盡相同宫盔。我的中學(xué)不同于現(xiàn)在的學(xué)校融虽。因?yàn)榻逃Y源...
    瘋子苦行僧閱讀 111評論 0 1