精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解 Java 中的 Lambda

開發 后端
如果你想給一個 Java 變量賦一段“代碼”,該怎么辦呢?在 Java 8 之前,這是不可能的。但在 Java 8 出現后,可以使用 Lambda 特性來做到這一點。

什么是 Lambda

我們知道,對于一個 Java 變量,我們可以給它賦一個“值”,然后可以用它做一些操作。

Integer a = 1;
String s = "Hello";
System.out.println(s + a);

如果你想給一個 Java 變量賦一段“代碼”,該怎么辦呢?例如,我想把右邊的代碼塊賦給一個名為 codeBlock 的 Java 變量。

在 Java 8 之前,這是不可能的。但在 Java 8 出現后,可以使用 Lambda 特性來做到這一點。

以下就是最直觀的寫法:

實際上是不允許這樣寫的會編譯失敗,這里只是為了讓大家方便理解

codeBlock = public void doSomething(String s) {
    System.out.println(s);
}

這種寫法不是很簡潔。我們可以去掉一些無用的聲明對代碼進行簡化。

codeBlock = public void doSomething(String s) {
   System.out.println(s);
}
// 這里的 public 是多余的,因為在這個上下文中不需要訪問修飾符。
codeBlock = void doSomething(String s) {
   System.out.println(s);
}
// 函數名 doSomething 也是多余的,因為已經將函數體賦值給了 codeBlock。
codeBlock = void (String s) {
   System.out.println(s);
}
// 編譯器可以自行推斷返回類型,這里不需要顯式地寫出 void。
codeBlock = (String s) {
   System.out.println(s);
}
// 編譯器可以自行推斷輸入參數類型,這里不需要顯式地寫出 String 類型。
codeBlock = (s) -> System.out.println(s);

這樣,我們就將一段“代碼”賦給了一個變量。而“這段代碼”,或者說“賦給變量的這個函數”,就是一個 Lambda 表達式。

但這里還有一個問題,即變量 codeBlock 應該是什么類型呢?在 Java 8 中,所有 Lambda 類型都是一個接口,而 Lambda 表達式本身,也就是“這段代碼”,需要是這個接口的一個實現。在我看來,這是理解 Lambda 的關鍵。簡而言之,Lambda 表達式本身就是一個接口的實現。直接這么說可能還是有點讓人困惑,所以我們繼續舉例。我們給上面的 codeBlock 添加一個類型:

codeBlock = (s)->System.out.println(s);

interface LambdaInterface {
    public void doSomething(String s);
}

這種只有一個函數需要實現的接口稱為“函數式接口”。為了防止后來的人給這個接口添加接口函數,導致有多個接口函數需要實現而變成“非函數式接口”,我們可以給這個接口添加一個聲明@FunctionalInterface,這樣其他人就不能給它添加新函數了。

@FunctionalInterface
interface LambdaInterface {
    public void doSomething(String s);
}

這樣,我們就得到了一個完整的 Lambda 表達式聲明。

LambdaInterface codeBlock =(s)System.out.println(s);

Lambda 表達式的作用是什么

最直觀的作用就是使代碼極其簡潔。我們可以比較一下 Lambda 表達式和傳統 Java 對同一接口的實現:

interface LambdaInterface {
public void doSomething(String s);
}

// Java 8
LambdaInterface codeBlock = (s) -> System.out.println(s);

// Java 7
publicclass LambdaInterfaceImpl implements LambdaInterface {
@Override
public void doSomething(String s) {
   System.out.println(s);
 }
}

這兩種寫法本質上是等價的。但顯然,Java 8 中的寫法更優雅簡潔。而且,由于 Lambda 可以直接賦給變量,我們可以直接將 Lambda 作為參數傳遞給函數,而 java7 必須有明確的接口實現和初始化定義:

// 定義了一個靜態方法 useLambda,它接受一個 LambdaInterface 類型的參數和一個 String 類型的參數。
public static void useLambda(LambdaInterface lambdaInterface, String s) {
    lambdaInterface.doSomething(s);
}

// Java 8
// 直接使用 Lambda 表達式調用 useLambda 方法。
   useLambda(s -> System.out.println(s), "Hello");
// Java 7
// 定義了一個 LambdaInterface 接口和一個實現該接口的 LambdaInterfaceImpl 類。
   interface LambdaInterface {
    public void doSomething(String s);
}

publicclass LambdaInterfaceImpl implements LambdaInterface {
    @Override
    public void doSomething(String s) {
        System.out.println(s);
    }
}
// 實例化 LambdaInterfaceImpl 類,并將實例傳遞給 useLambda 方法。
LambdaInterface myLambdaInterface = new LambdaInterfaceImpl();
useLambda(myLambdaInterface, "Hello");

在某些情況下,這個接口實現只需要使用一次。Java 7 要求你定義一個接口然后實現它。相比之下,Java 8 的 Lambda 看起來干凈得多。Lambda 結合了函數式接口庫、forEach、stream()、方法引用等新特性,使代碼更加簡潔!我們直接看例子。

@Getter
@AllArgsConstructor
public static class Student {
    private String name;
    private Integer age;
}

List<Student> students = Arrays.asList(
        new Student("Bob", 18),
        new Student("Ted", 17),
        new Student("Zeka", 18)
);

現在你需要打印出 students 中所有 18 歲學生的名字。

原始的 Lambda 寫法:定義兩個函數式接口,定義一個靜態函數,調用靜態函數并給參數賦值 Lambda 表達式。

@FunctionalInterface
interface AgeMatcher {
    boolean match(Student student);
}

@FunctionalInterface
interface Executor {
    boolean execute(Student student);
}

public static void matchAndExecute(List<Student> students, AgeMatcher matcher, Executor executor) {
    for (Student student : students) {
        if (matcher.match(student)) {
            executor.execute(student);
        }
    }
}

public static void main(String[] args) {
    List<Student> students = Arrays.asList(
            new Student("Bob", 18),
            new Student("Ted", 17),
            new Student("zeka", 18)
    );
    matchAndExecute(students,
            s -> s.getAge() == 18,
            s -> System.out.println(s.getName())
    );
}

這段代碼實際上已經比較簡潔了,但我們還能更簡潔嗎?當然可以,Java 8 中有一個函數式接口包,它定義了大量可能用到的函數式接口(java.util.function (Java Platform SE 8))。

因此,我們根本不需要在這里定義 AgeMatcher 和 Executor 這兩個函數式接口。我們可以直接使用 Java 8 函數式接口包中的 Predicate(T) 和 Consumer(T),因為它們的一對接口定義實際上與 AgeMatcher/Executor 相同。

第一步簡化:利用函數式接口

public static void matchAndExecute(List<Student> students, Predicate<Student> predicate, Consumer<Student> consumer) {
    for (Student student : students) {
        if (predicate.test(student)) {
            consumer.accept(student);
        }
    }
}

matchAndExecute 中的 forEach 循環實際上很煩人。這里可以使用 Iterable 自帶的 forEach 代替。forEach 本身可以接受一個 Consumer(T) 參數。

第二步簡化:用 Iterable.forEach 代替 forEach 循環:

public static void matchAndExecute(List<Student> students, Predicate<Student> predicate, Consumer<Student> consumer) {
    students.forEach(s -> {
        if (predicate.test(s)) {
            consumer.accept(s);
        }
    });
}

由于 matchAndExecute 實際上只是對 List 的一個操作,這里我們可以去掉 matchAndExecute,直接使用 stream() 特性來完成它。stream() 的幾個方法接受 Predicate(T) 和 Consumer(T) 等參數(java.util.stream (Java Platform SE 8))。一旦你理解了上面的內容,stream() 就很容易理解,不需要進一步解釋。

第三步簡化:用 stream() 代替靜態函數:

students.stream()
       .filter(s -> s.getAge() == 18)
       .forEach(s -> System.out.println(s.getName()));

與最初的 Lambda 寫法相比代碼量已經減少了非常多。但如果我們要求改為打印學生的所有信息,并且s -> System.out.println(s);那么我們可以使用方法引用來繼續簡化。所謂方法引用,就是用已經編寫好的其他 Object/Class 的方法來代替 Lambda 表達式。格式如下:

第四步簡化:可以在 forEach 中使用方法引用代替 Lambda 表達式:

students.stream()
       .filter(s -> s.getAge() == 18)
       .map(Student::getName)
       .forEach(System.out::println);

這基本上是我能寫出的最簡潔的版本了。

關于 Java 中的 Lambda 還有一些需要討論和學習的地方。例如,如何利用 Lambda 的特性進行并行處理等。總之,我只是給你一個大致的介紹,讓你有個概念。網上有很多關于 Lambda 的相關教程,多讀多練,隨著時間的推移肯定能夠掌握它。

責任編輯:趙寧寧 來源: 程序猿技術充電站
相關推薦

2024-03-12 08:23:54

JavaLambda函數式編程

2009-07-01 09:56:10

C#3.0

2019-10-10 17:53:36

大數據平臺架構LambdaKappa

2021-01-21 05:46:22

JavaLambda開發

2023-05-31 13:32:08

Javalambda函數

2009-06-22 10:34:43

Boost庫lambda

2009-09-14 13:57:20

C# Lambda表達Lambda表達式

2016-09-18 16:58:09

JavaProperties

2020-09-26 07:19:46

Java

2012-07-18 09:45:32

Java 8ScalaLambda

2013-01-05 02:19:50

JavaLambda表達式JVM

2020-03-29 20:38:35

PythonLambda語言

2023-10-10 10:43:19

JavaJDK1.8

2009-11-12 10:55:17

Lambda表達式

2025-02-05 12:22:21

2009-06-30 15:18:10

StringBuildJava

2009-06-25 15:20:28

CollectionMap

2012-06-26 10:03:58

JavaJava 8lambda

2022-06-27 08:36:08

PythonLambda

2009-07-09 09:51:07

Lambda表達式C#
點贊
收藏

51CTO技術棧公眾號

蜜臀久久99精品久久久无需会员| 亚洲午夜激情av| 国产精自产拍久久久久久蜜| 国产传媒免费在线观看| 国产免费av国片精品草莓男男| 亚洲精品免费在线| 久久大香伊蕉在人线观看热2| 69亚洲精品久久久蜜桃小说 | 欧美系列一区| 99久久亚洲精品日本无码| 亚洲青色在线| 久久精品99久久香蕉国产色戒 | 国产午夜精品福利| 亚洲自拍另类欧美丝袜| 亚洲va在线观看| 国内精品嫩模av私拍在线观看| 亚洲人成五月天| 伊人久久久久久久久| 日韩不卡在线| 性久久久久久久久久久久| 在线免费一区| 精品美女视频在线观看免费软件| 国产一本一道久久香蕉| 国产精品久久一| 精品国产免费观看| 欧美日韩专区| 欧美成人中文字幕| 美国一级黄色录像| 久久99国产成人小视频| 亚洲国产精品久久久久秋霞不卡| 亚洲美女性囗交| 姬川优奈av一区二区在线电影| 亚洲午夜久久久久| 中文字幕在线中文| 黄色网页在线播放| 中文字幕一区免费在线观看| 人禽交欧美网站免费| 神马午夜一区二区| 国产不卡免费视频| 91亚洲国产精品| 真实的国产乱xxxx在线91| 久久久www| 日本午夜人人精品| 日韩三级一区二区| 久久精品综合| 国产精品激情自拍| 欧美a视频在线观看| 美女国产一区| 国产91在线播放| 久久久精品视频网站| 久久精品1区| 日本亚洲欧洲色| www.日韩一区| 强制捆绑调教一区二区| 国产精品久久久久久中文字| 性高潮视频在线观看| 蜜桃久久av一区| 成人免费视频网址| 国产乱淫av免费| 国产成人免费视| 国产伦精品一区二区三区高清| 亚洲国产日韩在线观看| 不卡欧美aaaaa| 久久国产精品99久久久久久丝袜| 视频在线不卡| 日本一区二区三区国色天香| 亚洲精品tv久久久久久久久| 老司机99精品99| 一区二区三区成人| 精品人妻少妇一区二区| 伊人久久国产| 欧美日韩一二三| 三年中文在线观看免费大全中国| 久久视频免费| 亚洲国产精品va在线看黑人动漫| jizz日本免费| 日韩在线高清| 欧美成年人视频网站| 日韩精品一卡二卡| 久久亚洲视频| 91久久久久久久久久久久久| 亚洲精品视频专区| 国产日韩欧美在线一区| www.午夜色| av女在线播放| 欧美日韩一区在线观看| 国产一精品一aⅴ一免费| 亚洲制服一区| 久久久999精品视频| 国产乡下妇女做爰视频| 老司机午夜精品视频| 亚洲va电影大全| 三级黄视频在线观看| 国产精品久久久久久一区二区三区| 日日噜噜夜夜狠狠久久丁香五月| 2021中文字幕在线| 欧美精品成人一区二区三区四区| 欧美图片自拍偷拍| 欧美综合在线视频观看| 久久久久久久久国产精品| 69xxxx国产| 成人动漫一区二区| 在线成人性视频| 忘忧草在线日韩www影院| 欧美美女直播网站| 不卡一区二区在线观看| 欧美91视频| 国产精品美乳一区二区免费 | 天然素人一区二区视频| 日韩欧美一级片| 亚洲av熟女国产一区二区性色| 狠狠入ady亚洲精品经典电影| 国产精品久久久久久网站| 天天干天天草天天射| 亚洲视频在线一区| 日本新janpanese乱熟| 国产亚洲精品美女久久| 欧美成年人视频网站| 中文字幕视频在线播放| 91啪九色porn原创视频在线观看| 日本一本草久p| 99久久精品一区二区成人| 亚洲国产欧美一区二区丝袜黑人| 久久久久久久久久网站| 久久国产精品免费| 日韩久久久久久久久久久久久| 超碰97免费在线| 日韩欧美三级在线| 久久高清内射无套| 极品美女销魂一区二区三区| 亚洲精品国产系列| 日韩在线免费| 一级做a爰片久久毛片美女图片| 国产成人免费观看视频| 成人午夜在线播放| 国产欧美日韩小视频| 亚洲精品黑牛一区二区三区| 久久九九热免费视频| 一级片视频免费| 中文字幕欧美一区| 黄色一级片免费的| 99精品国产一区二区三区| 国产精品一二区| 成av人电影在线观看| 日本高清成人免费播放| 插吧插吧综合网| 蜜桃久久av| 欧美午夜精品久久久久久蜜| 浪潮色综合久久天堂| 亚洲片av在线| 中文无码精品一区二区三区 | 国产精品99精品无码视| 国产精品888| 日本人体一区二区| 日本在线中文字幕一区| 欧美有码在线观看| 国产中文字幕在线看| 在线看日本不卡| 久久久免费看片| 精品午夜久久福利影院| av久久久久久| 欧美日韩一区二区三区不卡视频| 69视频在线播放| 人成在线免费视频| 欧美曰成人黄网| 蜜桃视频最新网址| 国产成人亚洲精品青草天美| 91免费黄视频| 国产成人黄色| 成人福利视频在线观看| 女子免费在线观看视频www| 亚洲国产精久久久久久久| 欧美日韩一级黄色片| 国产精品午夜久久| 日韩av成人网| 久久久亚洲一区| 亚洲一区二区三区在线观看视频| 精品国产不卡一区二区| 91av在线视频观看| 91sp网站在线观看入口| 日韩精品一区在线| 无码人妻av免费一区二区三区 | 成人精品在线视频观看| 免费在线观看的av网站| 99tv成人| 久久久久久亚洲精品不卡4k岛国 | 日韩免费毛片| 99精品中文字幕在线不卡| 欧美专区第一页| 亚洲奶水xxxx哺乳期| 亚洲人在线视频| 午夜精品久久久久久久96蜜桃| 色综合久久久久综合体桃花网| 欧美肥妇bbwbbw| xf在线a精品一区二区视频网站| 亚洲欧美日韩一级| 国产精品久久777777毛茸茸| 影音先锋欧美在线| 婷婷国产精品| 99在线国产| 欧美日韩国产网站| 国内外成人免费激情在线视频网站 | 欧美无毛视频| 欧美激情网友自拍| 日本精品在线| 国产亚洲成精品久久| 亚洲国产精品18久久久久久| 欧美在线观看视频在线| 日韩精品一区二区三区国语自制| 成人免费在线观看入口| 一级特级黄色片| 国产成人av一区二区三区在线| 大香煮伊手机一区| 一本一本久久| www.男人天堂网| 天天操综合网| 一区二区三区av在线| 欧美裸体在线版观看完整版| av一区二区三区四区电影| 老司机精品视频网| 国产精品精品国产| 这里有精品可以观看| 国内精品小视频| 色呦呦在线看| 欧美成人全部免费| 快射视频在线观看| 日韩一区二区三区国产| 国产精品一区二区婷婷| 日韩高清不卡av| 天堂在线视频观看| 精品久久久久久久久久久久久久久久久| 97人人爽人人爽人人爽| 欧美性欧美巨大黑白大战| 亚洲黄网在线观看| 狠狠色狠色综合曰曰| 日韩 欧美 综合| 亚洲高清视频的网址| 欧美日韩免费做爰视频| 一区二区三区欧美久久| 美女的奶胸大爽爽大片| 亚洲另类中文字| 欧美人妻一区二区| 亚洲一区视频在线| 欧美日韩中文视频| 亚洲3atv精品一区二区三区| 一级片免费网址| 福利二区91精品bt7086| 久久国产视频一区| 在线欧美一区二区| 中文字幕一区二区免费| 欧美日韩大陆一区二区| 国产精品怡红院| 91精品婷婷国产综合久久| 国产不卡av在线播放| 欧美电视剧在线看免费| 少妇av在线播放| 亚洲日本中文字幕| 在线播放麻豆| 欧美老妇交乱视频| ririsao久久精品一区| 奇米四色中文综合久久| 欧美日韩五区| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品日本一区二区三区在线| 国产高清一区视频| 亚洲黄页网站| 一区二区三区三区在线| 欧美精品入口| 无罩大乳的熟妇正在播放| 日韩精品国产欧美| 天堂网成人在线| 93久久精品日日躁夜夜躁欧美| 男人天堂av电影| 亚洲视频一区在线| 国产成人无码精品| 欧美色国产精品| 国精品人妻无码一区二区三区喝尿| 亚洲精品一二区| 免费av在线| 91chinesevideo永久地址| 国产精品亚洲d| 成人3d动漫一区二区三区91| 偷拍亚洲色图| 国产内射老熟女aaaa| 国产婷婷精品| 中文字幕在线视频精品| 91在线观看一区二区| 在线免费看视频| 天天操天天色综合| 亚洲系列第一页| 日韩av综合网| av免费网站在线观看| 国产成人精品在线视频| 午夜电影一区| 亚洲福利av在线| 极品裸体白嫩激情啪啪国产精品| 国产情侣av自拍| 成人涩涩免费视频| 亚洲欧美另类日本| 91久久精品国产91性色tv| 亚洲精品无遮挡| 精品国产一区二区三区久久久| 小h片在线观看| 成人av资源网| 久久影院一区| 北条麻妃在线视频| 99综合电影在线视频| 国产精品 欧美激情| 欧美性猛交xxxx免费看漫画| 午夜精品一区二区三| 日韩中文字幕在线播放| 成人av三级| 激情五月综合色婷婷一区二区| 亚洲午夜精品一区二区国产| 亚洲色图38p| 久久综合狠狠综合久久综合88| 曰本女人与公拘交酡| 欧美久久一二三四区| 福利在线观看| 国产不卡一区二区在线播放| 成人av综合网| 无码人妻少妇伦在线电影| 国产福利视频一区二区三区| 四虎地址8848| 欧美裸体一区二区三区| 成年人在线看| 国产不卡一区二区在线播放| 最近国产精品视频| 欧美在线观看www| 9l国产精品久久久久麻豆| 久久精品视频9| 欧美精品一区二区三区在线| 午夜小视频在线观看| 亚洲综合色激情五月| 欧美+日本+国产+在线a∨观看| 久久久久久久久久一区二区| 国产精品久久久久久户外露出 | 青青国产在线观看| 日韩成人av网| 在线女人免费视频| 久久资源av| 久久一二三区| 久久婷婷五月综合| 欧美丝袜第三区| eeuss影院在线播放| 国产精品一二区| 国产二区精品| 中文字幕在线视频一区二区| 夜夜精品视频一区二区| 成人黄色免费视频| 一区二区免费在线播放| 亚洲天堂第一区| 国内精品自线一区二区三区视频| 欧美a级片免费看| 91麻豆精品国产91久久久资源速度 | 久久综合九色欧美综合狠狠| 国产精品久免费的黄网站| 亚洲日本中文字幕| 日本免费在线一区| 久久免费一级片| 成人免费毛片app| 台湾佬中文在线| 在线看欧美日韩| 欧美日本三级| www插插插无码视频网站| 91亚洲精品一区二区乱码| 波多野结衣电车痴汉| 日韩在线视频一区| 亚洲精品一区二区三区中文字幕| 蜜桃视频一区二区在线观看| 不卡区在线中文字幕| 黄色av一区二区| 欧美成人午夜剧场免费观看| 丁香五月缴情综合网| 日韩欧美xxxx| 亚洲视频一区二区在线| 日本高清视频在线| 国产精品福利在线观看| 影音先锋日韩精品| 精品人妻一区二区三区香蕉| 欧美日韩国产影片| 搞黄网站在线看| 日韩一区不卡| 国产成人精品免费一区二区| 国产午夜性春猛交ⅹxxx| 中文字幕亚洲欧美日韩在线不卡| 欧洲一区在线| 亚洲精品高清无码视频| 亚洲精品欧美综合四区| 日韩av视屏| 97久久人人超碰caoprom欧美| 久久综合亚州| 欧美日韩成人免费观看| 在线视频欧美日韩| 国产丝袜一区| 免费在线观看污网站| 懂色av一区二区三区| a级毛片免费观看在线| 日本免费高清一区二区| 成人午夜精品在线|