1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        這個類庫可以幫助你理解Java中的函數式編程

        共 6811字,需瀏覽 14分鐘

         ·

        2021-06-23 23:09

        每當JDK發(fā)布了新版本就有同學說“你發(fā)任你發(fā),我用Java 8”,可在工作中有不少人依然不太擅長使用Java8的新特性,而這些特性往往讓Java不再“臃腫”。不過我個人認為Java8所有的新特性中最具有代表性的一定是函數式編程。有人會說這種風格太抽象難懂了,當你熟練掌握這種設定之后,你一定會感到很香。慢慢地你也會領會到函數式編程的魅力和精髓。今天介紹一個函數式Java工具包,它表現了很多優(yōu)秀的函數式編程思想。以前介紹的熔斷降級組件Hystrix的替代品resilience4j就基于vavr庫。

        Vavr

        Vavr是一個Java8函數庫,它運用了大量的函數式編程范式。創(chuàng)造性地封裝了一些持久性的數據結構和函數式控制結構。而且從中可以學到很多有用的編程思想。

        可觀察的副作用

        我們的代碼中經常會出現一些看不見的陷阱,從代碼語義中這些陷阱是無法被觀察的。例如

        int divide(int a, int b){
         return a/b;
        }

        我們知道a/b會得到一個整數,但是卻不能從代碼上明確地知道如果b=0將會拋出java.lang.ArithmeticException異常;而如果是a+b則不會帶來任何副作用。所以我們需要讓這種副作用是可觀察的。對于這一點Vavr做出了一種設計:

        Try<Integer> divide(Integer a, Integer b) {
            return Try.of(() -> a / b);
        }

        將可能的副作用封裝到一個容器中,明確了可能的失敗,當你看到返回的是Try<Integer>時,就意味著結果可能“并不順利”,以便于針對性地進行預防。

        不可變的數據結構

        很多語言都在使用不可變的數據結構,比如Golang、Kotlin。主要原因是不可變的值:

        • 本質上是線程安全的,因此不需要同步
        • 對于equalshashCode是可靠的
        • 不需要克隆
        • 在非受檢unchecked類型轉換中是類型安全的
        • 對于函數式編程來說不可變值是最透明的

        為此Vavr設計了一個集合類庫,旨在代替Java中的集合框架。Vavr 的集合庫包含一組豐富的函數式數據結構,這些數據結構建立在 lambdas 之上。它們與 Java 原始集合共享的唯一接口是Iterable。這些數據結構是持久性的,一旦初始化本身就不可改變,你可以使用一些操作來返回更改后的副本。例如經典的數據結構單向鏈表:

        // 1   2  3
        List<Integer> source = List.of(123);

        如果我們將一個新元素0放在原始鏈表尾部的前面

        //  0  2  3
        List<Integer> newHeadList = source.tail().prepend(0);
        //  1  2  3
        System.out.println(source);

        原始鏈表保持不變,新的鏈表大小保持不變元素被替換了。當然你可以使用其它API來生成一個大小變化的副本,不過可以肯定的是原始的鏈表一定不會發(fā)生改變。

        // 0 1 2 3
        List<Integer> prepend = source.prepend(0);
        // 1 2 3 0
        List<Integer> append = source.append(0);

        這只是其中的一部分編程思想,接下來我將介紹Vavr的一些特色。

        Vavr的一些特色

        Vavr提供了一些非常有用的而且有特色的API。

        元組

        熟悉Python的同學對元組(Tuple)一定不陌生。元組將固定數量的元素組合在一起,以便它們可以作為一個整體傳遞。與數組或列表不同,元組可以包含不同類型的對象,但它也是不可變的。目前Vavr提供了最多8個元素的元組結構。

        // (felord.cn, 22)
        Tuple2<String, Integer> java8 = Tuple.of("felord.cn"22); 
        // felord.cn
        String s = java8._1; 
        // 22
        Integer i = java8._2;

        ?

        這個可以用來模擬Java中不具有的多返回值的特性。

        Function

        Java本身提供了Function接口,但是Vavr則提供了更加豐富的Function擴展,例如可以組合多個Function

        Function1<Integer, Integer> multiplyByTwo = a -> a * 2;
        Function1<Integer, Integer> compose = multiplyByTwo.compose(a -> a + 1);
        // 6
        Integer apply = compose.apply(2);

        除此之外,還可以讓潛在的副作用降級(lift),有點類似于微服務的熔斷,以避免在函數執(zhí)行中處理異常

        Function2<Integer, Integer, Integer> divide = (a, b) -> a / b;
        // 降級 
        Function2<Integer, Integer, Option<Integer>> safeDivide = Function2.lift(divide);
        // 返回一個加強版的Optional
        Option<Integer> apply = safeDivide.apply(10);
        boolean empty = apply.isEmpty();
        // true
        System.out.println(empty);

        還有派生操作:

         Function2<Integer, Integer, Integer> divide = (a, b) -> a / b;
         Function1<Integer, Integer> a = divide.apply(4);
         Integer apply = a.apply(2);

        這有點類似于柯里化,當我們用到更多入參時柯里化才更加明顯:

        Function3<Integer, Integer, Integer, Integer> sum = (a, b, c) -> a + b + c;
        final Function1<Integer, Function1<Integer, Integer>> add2 = sum.curried().apply(1);
        Integer apply = add2.apply(2).apply(3);

        ?

        猜一猜答案是幾?

        帶有特性的值容器

        這個不太好用中文說明,有一些值帶有獨特的性質,比如開頭提到的Try,用來顯式表明可能遇到異常。Vavr提供了很多具有獨特性質的值容器。

        Option

        類似Optional,但是比Optional更加強大。

        Lazy

        Lazy是一個惰性計算的容器,表示當使用時才去計算且只計算一次。

        Lazy<Double> lazy = Lazy.of(Math::random);
        lazy.isEvaluated(); // = false
        lazy.get();         // = 0.123  
        lazy.isEvaluated(); // = true
        lazy.get();         // = 0.123 
        // 需要使用數據時才從數據源加載
        Data lazyData = Lazy.val(DataSourceService::get, Data.class);

        其它還有一些非常有用的容器,你可以嘗試它們。

        模式匹配

        函數式編程語言大都支持模式匹配,同為JVM語言的Scala中就有這種特性,而Java目前是沒有的。可以有效地幫助我們減少if-else,舉個例子:

           public static String convert(int input) {

                String output;
                if (input == 1) {
                    output = "one";
                } else if (input == 2) {
                    output = "two";
                } else if (input == 3) {
                    output = "three";
                } else {
                    output = "unknown";
                }
                return output;
            }

        你就說吧,繞不繞?,Vavr就清爽多了。

            public static String vavrMatch(int input) {
                return Match(input).of(
                        Case($(1), "one"),
                        Case($(2), "two"),
                        Case($(3), "three"),
                        Case($(), "unknown")
                );
            }

        當然還有其它一些玩法需要你自己去發(fā)現。

        總結

        函數式編程作為Java8最大的一個亮點(個人認為),對于習慣于傳統(tǒng)OOP編程的開發(fā)者來說確實不容易接受。你不妨從Vavr類庫入手去學習函數式編程的思想。今天介紹的只是它很少的一部分,還有更多等著你去發(fā)現、去借鑒。忘記說了,如果你想在項目中引用它,可以引入下面這個坐標:

        <!-- https://mvnrepository.com/artifact/io.vavr/vavr -->
        <dependency>
            <groupId>io.vavr</groupId>
            <artifactId>vavr</artifactId>
            <version>0.10.3</version>
        </dependency>

        往期推薦

        Java17 新特性確定,Java之父:終于可以和一個長達25年的漏洞說再見了

        是時候轉型 Serverless 來玩微服務了嗎?

        還在用Jenkins?看看這些替代方案,是否更適合你!

        Spring 面試題(2021最新版)趕緊收藏!

        因一次騎行的臉剎著地,誕生了自動駕駛自行車!不愧是野生鋼鐵俠!太硬核了~~~



        點下方卡片,關注作者:碼農小胖哥

        分享高質量編程知識,探討IT人生

        瀏覽 50
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91亚洲精品国偷拍自产在线观看| 爱爱无码| 成人无码人妻| 日本老熟妇| a片一级片| 日韩精品在线一区| 色婷婷7777| 亚洲高清无码在线观看视频| 91双飞会所双飞在线| 亚州精品无码| 天堂中文字幕在线观看| 女人久久久| 欧美一级婬片AAAA毛片| 日韩精品人妻无码| 999国产视频| 亚洲AV无码精品国产| 国产av在| 免费电影日本黄色| av网站导航| 东北女人毛多又黑A片| 夜夜爽夜夜爽| 香蕉网站操逼片| 国产婷婷久久Av免费高清| 国产精品自拍视频| 国产骚妇| 亚洲免费三级片| 丝瓜视频| 一级黄色电影在线观看| 天堂在线无码| 看黄色一级片| www.日韩无码| 韩国三级HD久久精品HD| 久久精品视频一区| 欧美亚洲日韩在线观看| 亚洲精品女人| 69综合| 91精品视频在线免费观看| 亚洲成人视频一区二区| 日韩无修正| 自拍视频在线| 午夜成人黄色| 人人操人人超碰| 国内精产品一二区秘| a级黄色视频免费观看| 永井玛丽亚av无码中出流出| 中文字幕免费观看| 亚洲无码自拍| 青青青草视频在线| 北条麻妃A片在线播放| 草逼A片| 人妻无码精品久久人妻成人| 91人妻无码视频| 老熟女痒到不行-ThePorn| 在线免费观看黄色电影| 在线观看禁无码精品| 91日本| 免费69视频| 成人在线视频免费| 国产三级在线播放| 久久久在线| 成人伊人网| 91一区二区三区| 天堂无线av无码av| 三级片韩国AV| 亚洲国产另类精品| 99久久婷婷国产综合精品青牛牛 | 人妻少妇偷人精品久久| 人妻毛片| 亚洲AV人人夜夜澡人人| 欧美女人日逼视频| 亚洲AV无码成人精品区在线欢看| 成年视频网站| 嫩BBB| AV小说在线观看| AV日韩无码| 青青草视频| 成人特级毛片| 伊人大香蕉久久| 国产中文字幕在线播放| 日韩天天干| 亚洲aaa| 成人电影亚洲天堂| 亚洲无码黄色电影| 无码精品人妻一区二区| 99在线观看视频在线高清| 九九re精品视频在线观看| 久久久91人妻无码精品蜜桃ID| 亚洲色图自拍| 日韩AV无码成人精品| 亚洲综合中文字幕在线| 男女视频91| 中文字幕五月久久| 西西4444www大胆无| 日韩一区无码| 影音先锋自拍| 高清无码在线视频| 香蕉国产AV| 91亚色视频| 内射视频免费看| 久久国产热| 免费91| www.豆花视频成人版| 亚洲免费黄色视频| 亚洲AV成人精品一区二区三区| 人人爱人人射| 免费无码国产在线53| 色婷婷视频| 人妻无码HEYZO少妇精品| 亚洲欧美久久久久久久久久久久| 老司机午夜免费精品视频| 无码电影在线播放| 无码专区中文字幕| 亚洲小电影在线| 草久影院| 五月婷婷五月天| 亚洲成人精品| 超碰在线观看2407| 粉嫩AV在线| 麻豆一区在线| 亚洲中文字幕2019| jk在线观看| 中文字幕在线不卡| 操逼在线视频| Av天堂图片在线| 微拍福利一区二区| 4388亚洲最大| 国产精品永久久久久久久久久 | 黄色av免费在线观看| 99视频免费| 欧美日韩有码视频网址大全 | 亚洲无码aa| aa在线| 天堂在线中文网| 免费无码婬片AAAA片老婦| 农村一级婬片A片AAA毛片古装| 久草中文视频| h片在线播放| 色吧五月| 国产香蕉AV| 人操人操人操| 99热3| 国产精品综合激情| 中文字幕视频2023| 精品欧美激情精品一区| 青草久操| 亚洲第一中文字幕| 国产一级婬乱片AV片AAA毛片| 色片在线观看| 久久69| 国产操逼免费| 亚洲成人黄色在线| 最近最经典中文MV字幕| 天天干视频在线| 秋霞一区| 中文字幕在线观看第一页| 麻豆视频在线看| 亚洲永久天堂| 乱伦小视频| 九九色九九| 精品中文字幕在线观看| 日韩精品一区二区三区免费观看高清 | 久操久操久操| 我想看操逼| 成人电影一区二区| 五月婷婷视频| 久草黄色电影在线观看| 五月天视频网| 天天爽夜夜爽夜夜爽精品| 国产乱子伦精品免费,| 国产毛片在线看| 中文字幕++中文字幕明步| 成人影片在线观看18| 亚洲激色| 伊人成年网| 黄色小视频免费看| 国产顶级理伦| 欧美一级特黄A片免费观看| 亚洲少妇熟女| 激情视频在线免费观看| 婷婷五月亚洲| 日韩大屌操| 操逼视频在线免费看| 四川BBBBBB搡BBBBB| 久久亚洲AV| 亚洲高清无码视频| 中文字幕成人在线播放| 性综合网| 熟女18p| 野花av| 免费观看黄色成人网站| 美女A级毛片| AV大全在线观看| 大香蕉伊人在线观看| 麻豆91网站| 亚洲中文字幕日韩精品| 亚洲人成小说| 思思99热| 亚洲成人性爱av| 国产91在线看| 欧洲成人午夜精品无码区久久| 天天做天天爱天天爽| 久久夜色精品噜噜亚洲AV| 精品久久久无码| 欧美AⅤ在线| 精品人妻一区二区免费蜜桃视频| 国产精品免费久久影院| 婷婷国产| 成人国产片女人爽到高潮| 亚洲中文字幕日韩精品| 色婷婷中文在线| 怡春院院成人免费视频| 亚洲中文字幕免费视频| 91精品久久久久久久| 人人操人人超碰| 欧美性天天| 站街大龄熟女x| 欧美A片在线观看| 免费的一级A片| 日本A片在线免费观看| 国产成人精品123区免费视频| 天天综合色| 成人黄片在线免费观看| 安徽妇搡BBBB搡BBBB,另类老妇| 国产系列精品AV| 桃色五月天| 蜜桃Av噜噜一区二区三区| 亚洲韩国国产| 在线观看免费视频黄| 男插女青青影院| 黄色视频一区二区| 波多野结衣与黑人| 婷婷色AV| 国产AV激情| 亚洲第一黄| 波多野结衣一区二区三区在线观看 | 大香蕉少妇| 国产黄片免费在线观看| 日韩欧美视频| AV国产精品| 亚洲国产黄色视频| 黄色大片免费看| 日本久久成人| 欧美精品A级片| 国产777| 欧美啪啪啪| 95四川乱子伦视频国产| 高潮视频在线| AV狠狠干| 中文字幕片av| 黄色片在线播放| 日本免费黄色片| 三级片无码在线播放| 国产精品黄色电影| 日老女人的逼| 黄色网址在线免费观看| x88AV吊钟奶熟女| 加勒比无码在线播放| 久草福利网| 午夜成人中文字幕| 日韩大香蕉网| 五月婷婷激情网| 一本视频| 天天艹天天干| 欧性猛交ⅩXXX乱大交| а√最新版天堂中文在线| 一级黄色在线观看| 亚洲黄色免费观看| 九九热精品视频在线观看| 亚洲AV无码日韩AV无码导航| 中文字幕在线一区二区a| 日本免费黄色片| 国偷自产视频一区二区久| 久色91| 大香伊人| 日本色中文字幕| 高清无码中文字幕在线观看| 操骚逼视频| 午夜福利在线播放| 波多野成人无码精品视频| 国产狂喷水潮免费网站www | 你懂的国产| 91免费观看视频| 91porn国产| 免费看成人A片无码照片88hⅤ| 久色视频福利| 黄色一级片免费| 成人自拍视频在线观看| 少妇69p| 91三级在线观看| 国产熟妇| 欧美AAAAAAAA| 亚洲人成无码| 久久精品综合| 成人aV无码精品国产一区二区 | 日韩高清无码成人| 麻豆黄色| 一区二区久久| 深夜av| 国产网站在线| 青春草在线免费观看|