最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Lambda 表達(dá)式深度解析

 更新時(shí)間:2026年04月24日 09:43:36   作者:代碼or搬磚  
本文介紹了Java 8中的Lambda表達(dá)式,詳細(xì)介紹了方法引用、Stream API與Lambda在集合操作中的應(yīng)用及在MyBatis Plus中的應(yīng)用,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

一、Lambda 表達(dá)式基礎(chǔ)

1、什么是 Lambda 表達(dá)式

Lambda 表達(dá)式是 Java 8 引入的函數(shù)式編程特性,用于簡化匿名內(nèi)部類的寫法。
Lambda 表達(dá)式本質(zhì)上是一個(gè)匿名函數(shù)(沒有名字的函數(shù))。你可以把它理解為一小段可以傳遞的、即用即寫的代碼。

它的主要目的是為了簡化代碼,尤其是在需要使用匿名內(nèi)部類的場景下,能讓代碼變得非常簡潔、清晰。

2、基本語法

(parameters) -> expression
// 或
(parameters) -> { statements; }

二、Lambda 表達(dá)式的演變

1、 匿名內(nèi)部類 → Lambda

// 傳統(tǒng)匿名內(nèi)部類
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello World");
    }
};
// Lambda 表達(dá)式
Runnable runnable = () -> System.out.println("Hello World");

2、各種形式的 Lambda

// 1. 無參數(shù),無返回值
() -> System.out.println("Hello");
// 2. 一個(gè)參數(shù),無返回值
(x) -> System.out.println(x);
x -> System.out.println(x);  // 括號可選
// 3. 多個(gè)參數(shù),有返回值
(int x, int y) -> x + y;
(x, y) -> x + y;  // 類型推斷
// 4. 復(fù)雜邏輯,需要代碼塊
(x, y) -> {
    int result = x + y;
    System.out.println("結(jié)果: " + result);
    return result;
}

三、函數(shù)式接口

1、什么是函數(shù)式接口

只有一個(gè)抽象方法的接口,可以用作 Lambda 表達(dá)式的類型。

2、Java 內(nèi)置的常用函數(shù)式接口

1. Runnable - “執(zhí)行一個(gè)動(dòng)作”

作用:只做事,不要參數(shù),不返回結(jié)果

// 定義:無參無返回值
Runnable r = () -> System.out.println("Running");
// 使用場景:線程任務(wù)、簡單的代碼塊執(zhí)行
r.run(); // 輸出 "Running"
// 實(shí)際例子
new Thread(() -> System.out.println("在新線程中運(yùn)行")).start();
// 相當(dāng)于:執(zhí)行一段代碼塊
() -> {
    System.out.println("第一件事");
    System.out.println("第二件事");
}

2. Consumer - “消費(fèi)一個(gè)數(shù)據(jù)”

作用:吃進(jìn)一個(gè)數(shù)據(jù),消化掉(處理),不吐出來(不返回)

// 定義:消費(fèi)一個(gè)參數(shù),無返回值
Consumer<String> consumer = s -> System.out.println(s);
// 使用:接受數(shù)據(jù)并處理
consumer.accept("Hello World"); // 輸出 "Hello World"
// 實(shí)際例子
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println("你好," + name));
// 輸出:
// 你好,Alice
// 你好,Bob  
// 你好,Charlie
// 相當(dāng)于:處理接收到的數(shù)據(jù)
(數(shù)據(jù)) -> {
    // 處理這個(gè)數(shù)據(jù)
    // 但不返回任何結(jié)果
}

3. Supplier - “提供一個(gè)數(shù)據(jù)”

作用:不吃飯(不要參數(shù)),只吐奶(返回值)

// 定義:無參數(shù),返回一個(gè)值
Supplier<String> supplier = () -> "Hello";
// 使用:獲取數(shù)據(jù)
String result = supplier.get(); // result = "Hello"
// 實(shí)際例子
Supplier<Double> randomSupplier = () -> Math.random();
Supplier<LocalDateTime> timeSupplier = () -> LocalDateTime.now();
System.out.println(randomSupplier.get()); // 輸出隨機(jī)數(shù),如 0.12345
System.out.println(timeSupplier.get());   // 輸出當(dāng)前時(shí)間
// 相當(dāng)于:一個(gè)數(shù)據(jù)工廠
() -> {
    return 產(chǎn)生的數(shù)據(jù);
}

4. Function<T, R> - “轉(zhuǎn)換數(shù)據(jù)”

作用:吃進(jìn)T類型,吐出R類型(數(shù)據(jù)轉(zhuǎn)換)

// 定義:接受T參數(shù),返回R結(jié)果
Function<String, Integer> function = s -> s.length();
// 使用:數(shù)據(jù)轉(zhuǎn)換
int length = function.apply("Hello"); // length = 5
// 實(shí)際例子
Function<String, String> toUpperCase = s -> s.toUpperCase();
Function<Integer, String> intToHex = i -> Integer.toHexString(i);
System.out.println(toUpperCase.apply("hello")); // 輸出 "HELLO"
System.out.println(intToHex.apply(255));        // 輸出 "ff"
// 相當(dāng)于:數(shù)據(jù)加工廠
(輸入數(shù)據(jù)) -> {
    return 加工后的數(shù)據(jù);
}

5. Predicate - “判斷條件”

作用:吃進(jìn)數(shù)據(jù),回答"是"或"否"

// 定義:接受T參數(shù),返回boolean
Predicate<String> predicate = s -> s.isEmpty();
// 使用:條件判斷
boolean result = predicate.test("");    // result = true
boolean result2 = predicate.test("Hi"); // result2 = false
// 實(shí)際例子
Predicate<String> isLongWord = s -> s.length() > 5;
Predicate<Integer> isEven = n -> n % 2 == 0;
List<String> words = Arrays.asList("apple", "banana", "cat", "elephant");
words.stream()
     .filter(isLongWord)  // 過濾出長度>5的單詞
     .forEach(System.out::println);
// 輸出:banana, elephant
// 相當(dāng)于:條件檢查器
(數(shù)據(jù)) -> {
    return 數(shù)據(jù)是否符合條件;
}

四、方法引用

1、方法引用的四種形式

// 1. 靜態(tài)方法引用
Function<String, Integer> parser = Integer::parseInt;
// 2. 實(shí)例方法引用
String str = "Hello";
Supplier<Integer> lengthSupplier = str::length;
// 3. 任意對象的實(shí)例方法引用
Function<String, String> upperCase = String::toUpperCase;
// 4. 構(gòu)造方法引用
Supplier<List<String>> listSupplier = ArrayList::new;

2、方法引用示例

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// Lambda 表達(dá)式
names.forEach(name -> System.out.println(name));
// 方法引用
names.forEach(System.out::println);
// 靜態(tài)方法引用
List<Integer> numbers = Arrays.asList(1, 2, 3);
numbers.stream()
       .map(String::valueOf)  // 靜態(tài)方法引用
       .forEach(System.out::println);

五、Stream API 與 Lambda

1、Stream 基礎(chǔ)操作

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 過濾
List<String> result = names.stream()
    .filter(name -> name.length() > 3)      // Predicate
    .map(String::toUpperCase)               // Function
    .sorted()                               // Comparator
    .collect(Collectors.toList());          // Collector

2、常用 Stream 操作

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 過濾偶數(shù),平方,然后求和
int sum = numbers.stream()
    .filter(n -> n % 2 == 0)           // 過濾偶數(shù)
    .map(n -> n * n)                   // 平方
    .reduce(0, Integer::sum);          // 求和
// 分組操作
Map<String, List<Person>> peopleByCity = people.stream()
    .collect(Collectors.groupingBy(Person::getCity));  // 方法引用

六、在集合操作中的應(yīng)用

1、List 操作

List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
// 遍歷
list.forEach(item -> System.out.println(item));
// 排序
list.sort((a, b) -> a.compareTo(b));
list.sort(String::compareTo);  // 方法引用
// 過濾
List<String> filtered = list.stream()
    .filter(s -> s.startsWith("A"))
    .collect(Collectors.toList());

2、Map 操作

Map<String, Integer> map = new HashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);
map.put("Charlie", 35);
// 遍歷
map.forEach((name, age) -> 
    System.out.println(name + ": " + age));
// 轉(zhuǎn)換
Map<String, String> nameLength = map.entrySet().stream()
    .collect(Collectors.toMap(
        Map.Entry::getKey,                   // 鍵
        entry -> String.valueOf(entry.getValue())  // 值
    ));

七、在 MyBatis-Plus 中的應(yīng)用

1、LambdaQueryWrapper

// 實(shí)體類屬性引用
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "張三")           // 方法引用
      .gt(User::getAge, 18)                // Lambda
      .like(User::getEmail, "@gmail.com");
// 等價(jià)于:WHERE name = '張三' AND age > 18 AND email LIKE '%@gmail.com%'

2、復(fù)雜條件構(gòu)建

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
// 條件分組
wrapper.and(w -> w
    .eq(User::getStatus, 1)
    .or()
    .eq(User::getStatus, 2)
).or(w -> w
    .gt(User::getAge, 60)
    .lt(User::getAge, 18)
);
// 等價(jià)于:WHERE (status = 1 OR status = 2) OR (age > 60 OR age < 18)

到此這篇關(guān)于Java Lambda 表達(dá)式深度解析的文章就介紹到這了,更多相關(guān)Java Lambda 表達(dá)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot整合微信支付sdk過程解析

    springboot整合微信支付sdk過程解析

    這篇文章主要介紹了springboot整合微信支付sdk過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • java 中List按照date排序的實(shí)現(xiàn)

    java 中List按照date排序的實(shí)現(xiàn)

    這篇文章主要介紹了java 中List按照date排序的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java并發(fā)計(jì)數(shù)器的深入理解

    Java并發(fā)計(jì)數(shù)器的深入理解

    這篇文章主要給大家介紹了關(guān)于Java并發(fā)計(jì)數(shù)器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java 多線程優(yōu)先級實(shí)例詳解

    Java 多線程優(yōu)先級實(shí)例詳解

    這篇文章主要介紹了Java 多線程優(yōu)先級實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java中StringBuilder類常用方法總結(jié)

    Java中StringBuilder類常用方法總結(jié)

    這篇文章主要介紹了Java中StringBuilder類常用方法的相關(guān)資料,StringBuilder類是Java中用于頻繁修改字符串的可變字符串緩沖區(qū)類,它提供了多種方法進(jìn)行字符串操作,如添加、插入、刪除、替換字符等,需要的朋友可以參考下
    2024-12-12
  • Java超詳細(xì)講解如何生成隨機(jī)整數(shù)

    Java超詳細(xì)講解如何生成隨機(jī)整數(shù)

    在?Java?中,生成隨機(jī)數(shù)的場景有很多,所以本文我們就來盤點(diǎn)一下?幾種生成隨機(jī)數(shù)的方式,以及它們之間的區(qū)別和每種生成方式所對應(yīng)的場景
    2022-05-05
  • Java中Comparator升序降序的具體使用

    Java中Comparator升序降序的具體使用

    本文主要介紹了Java中Comparator升序降序的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 關(guān)于spring中bean注冊的優(yōu)先級分析

    關(guān)于spring中bean注冊的優(yōu)先級分析

    Spring框架中,Bean的定義方式主要有三種:XML定義、注解掃描和配置類中的@Bean注解,在Bean注冊過程中,XML定義的GenericBeanDefinition優(yōu)先級最高
    2024-09-09
  • Java中@ConditionalOnProperty注解使用

    Java中@ConditionalOnProperty注解使用

    在Spring?Boot中,@ConditionalOnProperty注解是一種方便的工具,用于根據(jù)應(yīng)用程序配置文件中的屬性值來控制Bean的創(chuàng)建和加載,本文就來介紹一下Java中@ConditionalOnProperty注解使用,感興趣的可以了解一下
    2023-11-11
  • Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶

    Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶

    這篇文章主要介紹了Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶,需要的朋友可以參考下
    2020-05-05

最新評論

六盘水市| 新源县| 澎湖县| 湛江市| 台湾省| 辉县市| 大理市| 临西县| 庐江县| 德州市| 红桥区| 翼城县| 历史| 海兴县| 娄烦县| 青冈县| 望江县| 淮南市| 玉环县| 延寿县| 和平区| 鄯善县| 壶关县| 洛隆县| 阿瓦提县| 普安县| 宝兴县| 郯城县| 田林县| 临夏市| 洪洞县| 灵台县| 革吉县| 建湖县| 五家渠市| 乃东县| 余干县| 阳泉市| 财经| 乌鲁木齐县| 吉水县|