亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java 8 Lambda

2019-11-06 06:24:00
字體:
來源:轉載
供稿:網友

為什么需要Lambda表達式

不要糾結什么是Lambda表達式,什么是函數式編程,先來看一下java8新的語法特性帶來的便利之處,相信你會過目不忘的。

在有Lambda表達式之前,要新建一個線程,需要這樣寫:

package com.lambdatest;/** * Created by root on 3/6/17. */public class Main {    public static void main(String[] args) {        new Thread(new Runnable() {            @Override            public void run() {                System.out.PRintln("Thread run()");            }        }).start();    }}

有Lambda表達式之后,則可以這樣寫:

package com.lambdatest;/** * Created by root on 3/6/17. */public class Main {    public static void main(String[] args) {        new Thread(                () -> System.out.println("Thread run()")        ).start();    }}

正如你所見,之前無用的模板代碼不見了!如上所示,Lambda表達式一個常見的用法是取代(某些)匿名內部類,但Lambda表達式的作用不限于此。

Lambda表達式的原理

剛接觸Lambda表達式可能覺得它很神奇:不需要聲明類或者方法的名字,就可以直接定義函數。這看似是編譯器為匿名內部類簡寫提供的一個小把戲,但事實上并非如此,Lambda表達式實際上是通過invokedynamic指令來實現的。先別管這么多,下面是Lambda表達式幾種可能的書寫形式,“看起來”并不是很難理解。

        Runnable run = () -> System.out.println("Hello World");        ActionListener listener = event -> System.out.println("button clicked");        Runnable multiline = () -> {            System.out.println("Hello");            System.out.println("World");        };        BinaryOperator<Long> add = (Long x, Long y) -> x + y;        BinaryOperator<Long> addImplicit = (x, y) -> x + y;

通過上面的代碼可以發現:

Lambda表達式是有類型的,賦值操作的左邊就是類型。Lambda表達式的類型實際上是對應接口的類型。Lambda表達式可以包含多行代碼,需要用大括號把代碼塊括起來,就像寫函數一樣。大多數時候,Lambda表達式的參數表可以省略類型,這得益于javac的類型推導機制,編譯器可以根據上下文推導出類型信息。表面上看起來每個Lambda表達式都是原來匿名內部類的簡寫形式,該內部類實現了某個函數接口(Functional Interface),但事實上比這稍微復雜一些,這里不再展開。所謂函數接口是指內部只有一個接口函數的接口。Java是強類型語言,無論有沒有顯式指明,每個變量和對象都必須有明確的類型,沒有顯式指定的時候編譯器會嘗試確定類型。Lambda表達式的類型就是對應函數接口的類型。

Lambda表達式和Stream

Lambda表達式的另一個重要的用法,是和Stream一起使用。Stream is a sequence of elements supporting sequential and parallel aggregate operations。Stream就是一組元素的序列,支持對這些元素進行各種操作,而這些操作是通過Lambda表達式指定的??梢园裇tream看作Java Collection的一種視圖,就像迭代器是容器的一種視圖那樣(但Stream不會修改容器中的內容)。下面例子展示了Stream的常見用法:

例子1

假設需要從一個字符串列表中選出以數字開頭的字符串并輸出,Java 7之前是這樣寫的:
package com.lambdatest;import java.util.Arrays;import java.util.List;/** * Created by root on 3/6/17. */public class Main {    public static void main(String[] args) {        List<String> list = Arrays.asList("1one", "two", "three", "4four");        for(String str : list) {            if(Character.isDigit(str.charAt(0))) {                System.out.println(str);            }        }    }}而Java 8需要這樣寫:
package com.lambdatest;import java.util.Arrays;import java.util.List;/** * Created by root on 3/6/17. */public class Main {    public static void main(String[] args) {        List<String> list = Arrays.asList("1one", "two", "three", "4four");        list.stream()   // 得到容器的Stream                .filter(str -> Character.isDigit(str.charAt(0)))    // 選出以數字開頭的字符串                .forEach(str -> System.out.println(str));   // 輸出字符串    }}上述代碼首先調用list.stream()方法得到容器的Stream,然后調用filter()方法過濾出以數字開頭的字符串,最后調用forEach()方法輸出結果。使用Stream有兩個明顯的好處:減少了模板代碼,只用Lambda表達式指名所需操作,代碼語義更加明確,便于閱讀。將外部迭代改成了Stream的內部迭代,方便了JVM本身對迭代過程進行優化(比如可以并行迭代)。

例子2

假設要從一個字符串列表中,選出所有不以數字開頭的字符串,并將其轉換成大寫形式,并把結果放到新的集合當中。Java 8的書寫代碼如下:
package com.lambdatest;import java.util.Arrays;import java.util.List;import java.util.Set;import java.util.stream.Collectors;/** * Created by root on 3/6/17. */public class Main {    public static void main(String[] args) {        List<String> list = Arrays.asList("1one", "two", "three", "4four");        Set<String> strSet = list.stream()   // 得到容器的Stream                .filter(str -> !Character.isDigit(str.charAt(0)))    // 選出不以數字開頭的字符串                .map(String::toUpperCase)   // 轉換成大寫形式                .collect(Collectors.toSet());   // 生成結果集    }}上面的代碼首先調用list.stream()方法得到容器的Stream,然后調用filter()方法選出不以數字開頭的字符串,之后調用map()方法將字符串轉換成大寫形式,最后調用collect()方法將結果轉換成Set。這個例子還向我們展示了方法引用(method references),以及收集器(collector)的用法,這里不再展開說明。通過這個例子我們看到了Stream鏈式操作,即多個操作可以連成一串。不用擔心這會導致對容器的多次迭代,因為不是每個Stream操作都會立即執行的。Stream的操作分為兩類,一類是中間操作(intermediate operations),另一類是結束操作(terminal operations),只有結束操作才會導致真正的代碼執行,中間操作只會做一些標記,表示需要對Stream進行某種操作,這意味著可以在Stream上通過關聯多種操作,但最終只需要一次迭代。如果你熟悉Spark RDD,對這些概念應該不陌生。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久福利| 欧美日本精品在线| 日韩av日韩在线观看| 欧美一区二区大胆人体摄影专业网站| 日韩av综合网站| 国产在线98福利播放视频| 国产福利精品视频| 91亚洲国产成人久久精品网站| 欧美一区二三区| 国产精品尤物福利片在线观看| 国内精品视频在线| 精品国产一区二区三区久久狼5月| 亚洲精品一区二区在线| 永久555www成人免费| 亚洲电影中文字幕| 亚洲国产精品一区二区久| 日产精品久久久一区二区福利| 午夜欧美不卡精品aaaaa| 色悠久久久久综合先锋影音下载| 91日本视频在线| 韩国美女主播一区| 国自产精品手机在线观看视频| 国产精品久久一区主播| 亚洲欧美日韩一区二区在线| 国产成人精品免高潮费视频| 久久久精品久久久久| 这里只有精品在线播放| 91高清视频免费| 欧美野外猛男的大粗鳮| 亚洲夜晚福利在线观看| 日韩成人av在线| 91久久精品国产91久久性色| 日本一区二区在线免费播放| 日韩成人在线电影网| 97视频人免费观看| 91免费人成网站在线观看18| 久久av在线播放| 国产视频精品在线| 欧美日韩成人免费| 在线视频国产日韩| 成人免费视频a| 中文字幕国内精品| 久久人人爽人人| 国产一区二区三区视频免费| 日韩一区二区久久久| 性色av香蕉一区二区| 欧美成人中文字幕在线| 亚洲国产精品视频在线观看| 中文字幕亚洲自拍| 九色91av视频| 日韩精品在线免费播放| 欧美激情亚洲激情| 国产亚洲美女久久| 久久久久国产精品www| 欧美大片在线免费观看| 久久综合久久八八| 国产精品爱啪在线线免费观看| 色www亚洲国产张柏芝| 日韩欧美亚洲一二三区| 日韩专区在线播放| 欧美福利在线观看| 最近中文字幕日韩精品| 国产精品海角社区在线观看| 中文字幕日韩免费视频| 日韩av大片在线| 992tv成人免费影院| 亚洲人成五月天| 国产精品狼人色视频一区| 亚洲色图美腿丝袜| 成人两性免费视频| 亚洲人成五月天| 91理论片午午论夜理片久久| 欧美性一区二区三区| 成人免费观看网址| 国产不卡一区二区在线播放| 中文字幕欧美日韩| 欧美成aaa人片免费看| 欧美日韩午夜激情| 国产一区二区丝袜高跟鞋图片| 成人在线视频网| 国产免费一区视频观看免费| 亚洲国产99精品国自产| 国产精品久久久亚洲| 国产69精品久久久| 国产亚洲精品高潮| 欧美在线国产精品| 亚洲成人精品在线| 97久久精品国产| 欧美一乱一性一交一视频| 国产999精品久久久| 国产精品视频网站| 日韩在线观看免费全| 91色精品视频在线| 欧美激情亚洲激情| 97在线视频一区| 亚洲毛片在线观看| 夜夜嗨av一区二区三区免费区| 日韩视频在线观看免费| 久久久999国产| 亚洲a∨日韩av高清在线观看| 亚洲欧美综合图区| 亚洲国产精品成人va在线观看| 国产成人精品亚洲精品| 日本电影亚洲天堂| 亚洲精品www久久久久久广东| 国内免费精品永久在线视频| 日韩高清欧美高清| 日韩一区二区在线视频| 热re91久久精品国99热蜜臀| 久久精品人人爽| www.午夜精品| 91免费观看网站| 亚洲午夜激情免费视频| 国产精品国产三级国产专播精品人| 国产91成人video| 亚洲人成欧美中文字幕| 久久久精品久久久久| 亚洲乱码av中文一区二区| 日韩免费在线观看视频| 亚洲性日韩精品一区二区| 国内成人精品一区| 超碰日本道色综合久久综合| 久久91亚洲人成电影网站| 国产精品久久久久久久久久久新郎| 久久久精品一区二区三区| 欧美壮男野外gaytube| 欧美性受xxxx白人性爽| 97精品在线观看| 国产亚洲欧美日韩精品| 欧美性极品xxxx做受| 亚洲一区二区三区在线免费观看| 欧美成人精品一区| 亚洲a级在线观看| 国产精品永久免费| 91理论片午午论夜理片久久| 国产一区深夜福利| 亚洲一区二区三区sesese| 久久久国产影院| 国产精品mp4| 国产精品入口免费视| 国产色综合天天综合网| 国产第一区电影| 亚洲一区中文字幕| 91国语精品自产拍在线观看性色| 欧美极品少妇与黑人| 91精品久久久久久久久久另类| 福利一区福利二区微拍刺激| 九九热精品视频| 国产在线播放不卡| 国产日韩中文字幕| 日韩中文视频免费在线观看| 中文字幕精品一区久久久久| 国产精品老女人精品视频| 欧美亚州一区二区三区| 成人激情视频在线播放| 日韩av中文在线| 亚洲iv一区二区三区| 日本a级片电影一区二区| 欧美黄网免费在线观看| 国产伦精品免费视频| 久久精品在线视频| 亚洲国产精品va在线| 成人国产精品久久久| 成人一区二区电影|