成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java8-4-stream api和函數(shù)式編程簡(jiǎn)單應(yīng)用

roadtogeek / 1415人閱讀

摘要:所以通過(guò)上面的例子可以看出函數(shù)式編程和結(jié)合的非常緊密。小結(jié)本篇簡(jiǎn)單介紹了函數(shù)式編程與應(yīng)用及類方法引用的使用,表達(dá)式讓老版本的代碼更簡(jiǎn)潔,方法引用讓表達(dá)式更簡(jiǎn)潔,實(shí)際上就是表達(dá)式的一種語(yǔ)法糖。

上一篇文章中,我們介紹了幾個(gè)Java8內(nèi)置的函數(shù)式接口的特點(diǎn)和使用方式,并在最后引出了stream api的知識(shí)點(diǎn),接下來(lái)我們開(kāi)始學(xué)習(xí)Java8中的stream api。
先假設(shè)一個(gè)簡(jiǎn)單的需求,存在一個(gè)字符串集合,我們想把所有長(zhǎng)度大于5的字符串轉(zhuǎn)換成大寫(xiě)輸出到控制臺(tái),之前我們可能會(huì)直接這么做

public class Test3 {
    public static void main(String[] args) {
        List list = Arrays.asList("hello","world","helloworld");

        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).length() > 5){
                System.out.println(list.get(i).toUpperCase());
            }
        }
    }
}

現(xiàn)在換成使用stream api看下

public class Test3 {
    public static void main(String[] args) {
        List list = Arrays.asList("hello","world","helloworld");
        list.stream().filter(s -> s.length() > 5).map(s -> s.toUpperCase()).forEach(System.out::println);
    }
}

1行代碼直接搞定,而且這種鏈?zhǔn)骄幊田L(fēng)格從語(yǔ)義上看邏輯很清晰。
stream方法先構(gòu)造了一個(gè)該集合的Stream對(duì)象,filter方法取出長(zhǎng)度大于5的字符串,map方法將所有字符串轉(zhuǎn)大寫(xiě),forEach輸出到控制臺(tái)。我們可以對(duì)照Stream接口的源碼片段看下這幾個(gè)stream api的定義

public interface Stream extends BaseStream> {
    
    Stream filter(Predicate predicate);
    
     Stream map(Function mapper);
    
    void forEach(Consumer action);
    .
    .省略
    .
}

filter方法,接收一個(gè)Predicate函數(shù)式接口類型作為參數(shù),并返回一個(gè)Stream對(duì)象,從上一篇我們知道可以由一個(gè)接收一個(gè)參數(shù)返回布爾類型的lambda表達(dá)式來(lái)創(chuàng)建Predicate函數(shù)式接口實(shí)例,所以看到filter接收的參數(shù)是s -> s.length() > 5

map方法,接收Function函數(shù)式接口類型,接收一個(gè)參數(shù),有返回值s -> s.toUpperCase() 正是做了這件事情

forEach方法,接收Consumer函數(shù)式接口類型,接收一個(gè)參數(shù),不返回值 這里使用方法引用的其中一種形式System.out::println來(lái)創(chuàng)建了Consumer實(shí)例。

所以通過(guò)上面的例子可以看出函數(shù)式編程和stream api結(jié)合的非常緊密。大家應(yīng)該也注意到了在介紹每個(gè)方法時(shí),我們提到了有中間操作和終止操作,終止操作意味著我們需要一個(gè)結(jié)果了,當(dāng)程序遇到終止操作時(shí)才會(huì)真正執(zhí)行。中間操作是指在終止操作之前所有的方法,這些方法以方法鏈的形式組織在一起處理一些列邏輯,如果只有中間操作而沒(méi)有終止操作的話即使運(yùn)行程序,代碼也不會(huì)執(zhí)行的。

實(shí)際上map方法中可以使用另一種方法引用的形式來(lái)處理,類方法引用。語(yǔ)法:類名::方法名

public class Test3 {
    public static void main(String[] args) {
        List list = Arrays.asList("hello","world","helloworld");
        list.stream().filter(s -> s.length() > 5).map(String::toUpperCase).forEach(System.out::println);
    }
}

之前介紹的System.out::println這種屬于對(duì)象方法引用,類方法引用的應(yīng)用也是很廣泛的。只是理解起來(lái)需要花費(fèi)些時(shí)間,map方法接收一個(gè)Function函數(shù)式接口的實(shí)現(xiàn),那就肯定需要一個(gè)輸入并且有一個(gè)輸出,但是我們看下toUpperCase方法的定義

public String toUpperCase() {
    return toUpperCase(Locale.getDefault());
}

有返回值,但是沒(méi)有入?yún)?,乍一看也不符合Function接口中apply方法的定義啊。這也是類方法引用的特點(diǎn),雖然toUpperCase沒(méi)有明確的入?yún)?,因?yàn)榇藭r(shí)toUpperCase的輸入是調(diào)用它的那個(gè)對(duì)象,編譯器會(huì)把調(diào)用toUpperCase方法的那個(gè)對(duì)象當(dāng)做參數(shù),也就是lambda表達(dá)式s -> s.toUpperCase()中的s參數(shù)。所以也滿足一個(gè)輸入一個(gè)輸出的定義。

小結(jié):本篇簡(jiǎn)單介紹了函數(shù)式編程與stream api應(yīng)用及類方法引用的使用,lambda表達(dá)式讓老版本的代碼更簡(jiǎn)潔,方法引用讓lambda表達(dá)式更簡(jiǎn)潔,實(shí)際上就是lambda表達(dá)式的一種語(yǔ)法糖。

下一篇

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/70674.html

相關(guān)文章

  • 攻克前端javascript面試:什么是函數(shù)編程?

    摘要:僅在幾年以前,僅有少數(shù)的程序員知道函數(shù)式編程是什么。函數(shù)式編程是聲明性的而不是命令式的應(yīng)用狀態(tài)流經(jīng)純函數(shù)中。函數(shù)式編程是一種編程模式。在理解軟件是如何使用函數(shù)式編程構(gòu)建時(shí),理解函數(shù)組合是非常重要的一步。不可變性是函數(shù)式編程的核心概念。 函數(shù)式編程已然變成了一個(gè)javascript語(yǔ)言中一個(gè)非常熱門(mén)的話題。僅在幾年以前,僅有少數(shù)的js程序員知道函數(shù)式編程是什么。但是在過(guò)去三年中,我所見(jiàn)過(guò)...

    wslongchen 評(píng)論0 收藏0
  • 函數(shù)編程思維在三行代碼情書(shū)中的應(yīng)用

    摘要:函數(shù)式編程概述如今主流的編程語(yǔ)言,函數(shù)式編程范式或多或少都融入其中成了標(biāo)配,或者說(shuō)主流語(yǔ)言都在進(jìn)行函數(shù)式方面的擴(kuò)充,這是一個(gè)大趨勢(shì)。 showImg(https://segmentfault.com/img/remote/1460000015089083); 函數(shù)式編程概述 如今主流的編程語(yǔ)言,函數(shù)式編程范式或多或少都融入其中成了標(biāo)配,或者說(shuō)主流語(yǔ)言都在進(jìn)行函數(shù)式方面的擴(kuò)充,這是一...

    DC_er 評(píng)論0 收藏0
  • Js-函數(shù)編程

    摘要:組合組合的功能非常強(qiáng)大,也是函數(shù)式編程的一個(gè)核心概念,所謂的對(duì)過(guò)程進(jìn)行封裝很大程度上就是依賴于組合。在理解之前,先認(rèn)識(shí)一個(gè)東西概念容器容器為函數(shù)式編程里普通的變量對(duì)象函數(shù)提供了一層極其強(qiáng)大的外衣,賦予了它們一些很驚艷的特性。 前言 JavaScript是一門(mén)多范式語(yǔ)言,即可使用OOP(面向?qū)ο螅?,也可以使用FP(函數(shù)式),由于筆者最近在學(xué)習(xí)React相關(guān)的技術(shù)棧,想進(jìn)一步深入了解其思想...

    whinc 評(píng)論0 收藏0
  • 翻譯連載 | JavaScript 輕量級(jí)函數(shù)編程-第3章:管理函數(shù)的輸入 |《你不知道的JS》姊

    摘要:但是,對(duì)函數(shù)式編程而言,這個(gè)行為的重要性是毋庸置疑的。關(guān)于該模式更正式的說(shuō)法是偏函數(shù)嚴(yán)格來(lái)講是一個(gè)減少函數(shù)參數(shù)個(gè)數(shù)的過(guò)程這里的參數(shù)個(gè)數(shù)指的是希望傳入的形參的數(shù)量。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是...

    xiaowugui666 評(píng)論0 收藏0
  • Rxjs 響應(yīng)編程-第六章 使用Cycle.js的響應(yīng)Web應(yīng)用程序

    摘要:我們將使用,這是一個(gè)現(xiàn)代,簡(jiǎn)單,漂亮的框架,在內(nèi)部使用并將響應(yīng)式編程概念應(yīng)用于前端編程。驅(qū)動(dòng)程序采用從我們的應(yīng)用程序發(fā)出數(shù)據(jù)的,它們返回另一個(gè)導(dǎo)致副作用的。我們將使用來(lái)呈現(xiàn)我們的應(yīng)用程序。僅采用長(zhǎng)度超過(guò)兩個(gè)字符的文本。 Rxjs 響應(yīng)式編程-第一章:響應(yīng)式Rxjs 響應(yīng)式編程-第二章:序列的深入研究Rxjs 響應(yīng)式編程-第三章: 構(gòu)建并發(fā)程序Rxjs 響應(yīng)式編程-第四章 構(gòu)建完整的We...

    EastWoodYang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<