成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

函數(shù)式編程思維在三行代碼情書中的應(yīng)用

DC_er / 2149人閱讀

摘要:函數(shù)式編程概述如今主流的編程語言,函數(shù)式編程范式或多或少都融入其中成了標配,或者說主流語言都在進行函數(shù)式方面的擴充,這是一個大趨勢。

函數(shù)式編程概述

如今主流的編程語言,函數(shù)式編程范式或多或少都融入其中成了“標配”,或者說主流語言都在進行函數(shù)式方面的擴充,這是一個大趨勢。以Java為例,隨著 Lambda塊Stream API 等這種高階函數(shù)的加持,Java總算是裝備了函數(shù)式這一利器;博大精深的C++也在2011版的語言標準里加入了Lambda塊的支持;再比如前一段時間我初步體驗了的 Groovy語言,雖然其運行于JVM之上,然而其對 動態(tài)語言、函數(shù)式編程范式 以及 元編程功能 的加持所帶來的表現(xiàn)力和簡潔性可以說甩了Java幾條街,可以利用Groovy的所有動態(tài)功能構(gòu)建高性能的JVM應(yīng)用、將開發(fā)效率提高幾個數(shù)量級。語言的例子有很多,我不一一枚舉。

注: 本文首發(fā)于 My 公眾號 CodeSheep ,可 長按掃描 下面的 小心心 來訂閱 ↓ ↓ ↓

為什么要使用函數(shù)式編程范式

這里講幾個函數(shù)式編程的典型特點,區(qū)別的對象那就是傳統(tǒng)的命令式編程

0x01. 更高層次的抽象(高階函數(shù))

用高階抽象來取代基本的控制結(jié)構(gòu)本身就是一個全新的思考方式,這樣可以讓開發(fā)者聚焦精力于業(yè)務(wù)場景而無需費心復(fù)雜地層運作

舉個栗子:將一個字符串集合中的所有單詞轉(zhuǎn)為大寫,我們用Java語言來實現(xiàn)

如果按照傳統(tǒng)的命令式編程的解法,那接下來不出意外我們得來寫循環(huán)、遍歷這種迭代操作了:

for (int i=0; i

但如果使用Java的函數(shù)式編程范式,一切都是那么的優(yōu)雅,一句話搞定

wordList.stream.map( w -> w.toUpperCase() )

這里的map()函數(shù)就是所謂的高階函數(shù),我們用高階函數(shù)代替了底層的迭代,因為我們并沒有處理細節(jié),我們僅僅定義了映射的邏輯,迭代由高階函數(shù)來自動完成!

0x02. 提升代碼信噪比(簡潔性)

區(qū)別于面向?qū)ο笳Z言用抽象來封裝不確定因素,函數(shù)式編程通過盡量減少不確定因素來使代碼極度簡潔

上面的例子對于本條優(yōu)點的展現(xiàn)我想應(yīng)該也不必多說了

0x03. 控制權(quán)轉(zhuǎn)交于運行時(動態(tài)性)

區(qū)別于傳統(tǒng)的編譯形語言,配備函數(shù)式編程范式的動態(tài)語言更多的將控制權(quán)轉(zhuǎn)交到語言運行時手里,獲得的則是更高的靈活性、表現(xiàn)力和性能權(quán)衡。

這三點優(yōu)點將在接下來的例子中切實的感受并領(lǐng)會!

函數(shù)式編程例析 舉例1:詞頻統(tǒng)計

做的事情很簡單:給定一個單詞集合,統(tǒng)計出集合中除了助詞(如of、onthe等)之外的單詞出現(xiàn)的頻次,不區(qū)分大小寫

命令式解法: 至少分為以下幾大步

先進行循環(huán)迭代

然后統(tǒng)一將單詞轉(zhuǎn)為小寫

然后判斷單詞是否是助詞

最后進行詞頻統(tǒng)計

public class WordCount {

    // 定義一個助詞集合,這些單詞不參與計數(shù)
    private Set auxiliaryWordSet = new HashSet() {{
       add("of"); add("the"); add("to"); add("and"); add("so"); add("are");
    }};

    // 傳統(tǒng)命令式解法實現(xiàn)的詞頻統(tǒng)計函數(shù)
    public Map doWordCount( List context ) {
        Map result = new HashMap();
        for ( String word:context ) {  // 循環(huán)迭代
            String lowerCaseWord = word.toLowerCase();  // 將單詞統(tǒng)一轉(zhuǎn)換為小寫
            if( !auxiliaryWordSet.contains(lowerCaseWord) ) {
                if( null == result.get(lowerCaseWord) )
                    result.put( lowerCaseWord, 1 );
                else
                    result.put( lowerCaseWord, result.get(lowerCaseWord)+1 );
            }
        }
        return result;
    }

    // main() 函數(shù)
    public static void main(String[] args) {
        List wordList = new ArrayList() {{
            add("The"); add("Products"); add("of"); add("Samsung"); add("and"); add("Apple");
            add("are"); add("so"); add("amazing"); add("especially"); add("Apple");
        }};

        WordCount wordCount = new WordCount();
        Map res = wordCount.doWordCount( wordList );
        System.out.print(res); // 打?。簕apple=2, amazing=1, samsung=1, especially=1, products=1}
    }
}

函數(shù)式解法:

如果我們用Java的Stream API和Lambda塊所構(gòu)成的函數(shù)式范式來重寫 doWordCount() 函數(shù),一切都將如此簡潔:

public Map doWordCount2( List context ) {
    Map result = new HashMap();
    context.stream().map( w -> w.toLowerCase() )
            .filter( w -> !auxiliaryWordSet.contains(w) )
            .forEach( w -> result.put( w, result.getOrDefault(w,0) + 1 ) );
    return result;
}
備注:這里的getOrDefault是Java的Map提供的一個便利函數(shù),意思是:在Map中若沒有找到給定的key時,返回一個“默認值”

對比命令式解法,用戶省去了很多繁瑣的迭代和判斷,我們只講焦點聚焦在業(yè)務(wù)邏輯之上,代碼信噪比提升不小吧!

舉例2:連詞成句

給定一個離散的單詞集合,我們想將字母數(shù)大于1的單詞的首字母大寫后,用 短橫線- 連接起來成為一個句子

命令式解法:

public class WordConnect {

    // 將單詞的首字母大寫
    public String capitalizeFirstLetter( String s ) {
        return s.substring(0,1).toUpperCase() + s.substring(1,s.length() );
    }

    // 連詞成句
    public String connectWord( List context ) {
        StringBuilder result = new StringBuilder();
        for ( String word: context ) {
            if ( word.length() > 1 ) {
                result.append( capitalizeFirstLetter(word) );
                result.append("-");
            }
        }
        return result.substring(0,result.length()-1).toString();
    }

    // main()函數(shù)
    public static void main(String[] args) {
        List wordList = new ArrayList() {{
            add("The"); add("Products"); add("of"); add("Samsung"); add("and"); add("Apple");
            add("are"); add("so"); add("amazing"); add("especially"); add("Apple");
        }};

        WordConnect wordConnect = new WordConnect();
        String res = wordConnect.connectWord( wordList );
        System.out.print(res); // 打?。篢he-Products-Of-Samsung-And-Apple-Are-So-Amazing-Especially-Apple
    }
}

函數(shù)式解法1: Java Steam API 和 Lambda塊實現(xiàn)

public String connectWord( List context ) {
    return context.stream().filter( w -> w.length()>1 )
            .map( w -> capitalizeFirstLetter(w) )
            .collect( Collectors.joining("-") );
}

我什么都不想說了,這不要太簡潔好吧!

函數(shù)式解法2: Groovy語言實現(xiàn)

public String connectWord( context ) {
    context.findAll { it.length() >1 }
    .collect { it.capitalize() }
    .join "-"
}

關(guān)于Groovy語言的初體驗,可以參考我的文章:Groovy初體驗:構(gòu)建高性能JVM應(yīng)用

函數(shù)式最佳實踐:高效編寫三行情書

還記得去年的520,為了表達心中對于老婆無限的、無法表達的愛,我想寫一封不超過三行的代碼情書,我更想用盡可能短的代碼來盡可能多地表達,于是我選擇了函數(shù)式編程。

我的520三行代碼情書在此:

public TimeRiver timeFlow( List days ) {
    return (TimeRiver)days.stream()
        .filter( n->theDaysNotWithYou(n) )
        .map( e->accompanyByMyLove(e) )
        .collect( Collectors.joining("??") );
}

后記

文中提到的Groovy動態(tài)編程語言,作者體驗過一點,可以參考:Groovy初體驗:構(gòu)建高性能JVM應(yīng)用

如果有興趣,也來看看作者一些關(guān)于容器化、微服務(wù)化方面的文章:

RPC框架實踐之:Apache Thrift

微服務(wù)調(diào)用鏈追蹤中心搭建

利用K8S技術(shù)棧打造個人私有云連載文章

Docker容器可視化監(jiān)控中心搭建

利用ELK搭建Docker容器化應(yīng)用日志中心

Spring Boot應(yīng)用監(jiān)控實戰(zhàn)

作者更多的原創(chuàng)文章:在此

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69588.html

相關(guān)文章

  • 【響應(yīng)編程思維藝術(shù)】 (1)Rxjs專題學習計劃

    摘要:由于技術(shù)棧的學習,筆者需要在原來函數(shù)式編程知識的基礎(chǔ)上,學習的使用。筆者在社區(qū)發(fā)現(xiàn)了一個非常高質(zhì)量的響應(yīng)式編程系列教程共篇,從基礎(chǔ)概念到實際應(yīng)用講解的非常詳細,有大量直觀的大理石圖來輔助理解流的處理,對培養(yǎng)響應(yīng)式編程的思維方式有很大幫助。 showImg(https://segmentfault.com/img/bVus8n); [TOC] 一. 響應(yīng)式編程 響應(yīng)式編程,也稱為流式編程...

    lscho 評論0 收藏0
  • En-Tan-Mo(ETM)項目周報(5月17日~5月23日)

    摘要:項目進展通過神荼科技全面安全審計經(jīng)過一個多月的全面審計工作,神荼科技于本周交付相關(guān)安全審計測試報告,給出初步整改建議。剩余問題也已反饋到研發(fā)部門,將在近期得到解決并進一步與神荼科技溝通,進行二次審計。 showImg(https://segmentfault.com/img/bVbtKHf); 項目進展 Highlight:ETM 通過神荼科技全面安全審計 經(jīng)過一個多月的全面審計工作,...

    sugarmo 評論0 收藏0
  • 【響應(yīng)編程思維藝術(shù)】 (2)響應(yīng)Vs面向?qū)ο?/b>

    摘要:本文是響應(yīng)式編程第一章響應(yīng)式這篇文章的學習筆記。通過代碼對比可以發(fā)現(xiàn),在響應(yīng)式編程中,我們不再用對象的概念來對現(xiàn)實世界進行建模,而是使用流的思想對信息進行拆分和聚合。 本文是Rxjs 響應(yīng)式編程-第一章:響應(yīng)式這篇文章的學習筆記。示例代碼地址:【示例代碼】 更多文章:【《大史住在大前端》博文集目錄】 showImg(https://segmentfault.com/img/bVbuE...

    Tonny 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<