Lambda 表达式各种用法,你都会了吗

本文详细介绍了Java8中Lambda表达式的各种编写形式,包括无参数、单参数、多参数以及有返回值的情况,并通过示例展示了其在实际编程中的应用和灵活性。

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。

前言

Lambda表达式是 Java 8 中引入的最有影响力的功能之一。它们通过允许简洁而优雅地创建匿名函数来实现 Java 中的函数式编程。在这篇博文中,我们将探讨编写 lambda 表达式的各种形式。

概述

lambda 表达式是可以具有参数和主体的匿名函数。
正文可以包含零行、一行或多行代码,Lambda 表达式可以分配给类型为函数式接口(具有单个抽象方法的接口)的变量。

Lambda 表达式的各种编写形式

Java 中的Lambda 表达式 可以以各种形式编写,具体取决于它们所实现的函数式接口的抽象方法的签名。
以下是编写 lambda 表达式的一些不同方法:

1.无参数,无返回值:

如果抽象方法不带参数且不返回值,则 可以使用空括号和主体编写lambda 表达式:

() -> System.out.println("Hello, World!");

2. 单参数,无类型声明:

如果抽象方法采用单个参数,则可以省略参数周围的括号,并且可以推断类型:

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

3. 单参数,带类型声明:

(String s) -> System.out.println(s);

4. 多个参数:

如果抽象方法采用多个参数,则必须在参数两边加上括号。类型可以推断或显式声明:

(a, b) -> a + b;
(int a, int b) -> a + b;

5、有参数并且有返回值声明

如果 lambda 的主体由单个返回值的表达式组成,则可以直接编写:

(int a, int b) -> a + b;

如果主体由多个语句组成,则必须包含大括号并使用 return 语句:

(int a, int b) -> {
    int sum = a + b;
    return sum;
};

6.无参数,返回值:

如果抽象方法不带参数但有返回值,可以这样写:

() -> 42;

示例:各种形式的 Lambda 表达式

这是一个简单的 Java 程序,演示了各种形式的 Lambda 表达式

package com.example.spring.demo;

public class LambdaExample {

    public static void main(String[] args) {
        //无参数,无返回值:
        Runnable noParametersNoReturnValue = () -> System.out.println("Hello, World!");
        noParametersNoReturnValue.run(); // 输出: Hello, World!

        //单参数,无类型声明:
        java.util.function.Consumer<String> singleParameterNoType = s -> System.out.println(s);
        singleParameterNoType.accept("Single Parameter, No Type!"); // 输出: Single Parameter, No Type!
        //单参数,带类型声明:
        java.util.function.Consumer<String> singleParameterWithType = (String s) -> System.out.println(s);
        singleParameterWithType.accept("Single Parameter with Type!"); // 输出: Single Parameter with Type!

        //多个参数,无类型声明
        java.util.function.BiFunction<Integer, Integer, Integer> multipleParametersTypeInferred = (a, b) -> a + b;
        System.out.println(multipleParametersTypeInferred.apply(5, 10)); // 输出: 15

        //多个参数,有类型声明
        java.util.function.BiFunction<Integer, Integer, Integer> multipleParametersWithType = (Integer a, Integer b) -> a + b;
        System.out.println(multipleParametersWithType.apply(5, 10)); // 输出: 15

        // 多个参数,并且多行实现
        java.util.function.BiFunction<Integer, Integer, Integer> multipleStatements = (a, b) -> {
            int sum = a + b;
            return sum;
        };
        System.out.println(multipleStatements.apply(5, 10)); // 输出: 15

        // 无参数,但是有返回值
        java.util.function.Supplier<Integer> noParametersReturnValue = () -> 42;
        System.out.println(noParametersReturnValue.get()); // 输出: 42
    }
}

输出

Hello, World!
Single Parameter, No Type!
Single Parameter with Type!
15
15
15
42

结论

lambda表达式的形式,具体取决于参数的数量和类型、是否包含显式类型声明以及主体是由单个表达式还是多个语句组成,Java 中Lambda 表达式的灵活性,使我们能够编写简洁且富有表现力的代码。

<think>嗯,用户想了解MyBatis-Plus中Lambda表达式的不同用法。首先,我需要回忆一下MyBatis-Plus的Lambda查询功能。记得Lambda表达式在MyBatis-Plus中主要用于类型安全的查询,避免硬编码字段名,对吧? 首先,可能需要从基本的用法开始。比如,如何使用Lambda表达式进行条件构造。例如,eq、ne这些比较操作。然后可能还有范围查询,比如between、in之类的。还有排序和分组,比如orderBy和groupBy。还有嵌套条件,比如and和or的组合使用。此外,处理null值的情况也是用户可能关心的,比如使用isNull和isNotNull方法。 然后,用户提到“null”,可能想知道在Lambda表达式中如何处理null值,或者在条件中如何判断字段是否为null。比如,在SQL中,我们经常需要设置某个字段为NULL,或者在查询条件中筛选出NULL的记录。这时候,MyBatis-Plus的Lambda表达式应该提供相应的方法,比如isNull()和isNotNull()。 需要确认具体的API方法名称和用法是否正确。例如,是否确实有`isNull`和`isNotNull`方法,以及如何链式调用这些条件。同时,可能需要举例说明,比如查询某个字段为NULL的记录,或者更新某个字段为NULL的操作。 另外,用户可能对Lambda表达式在更新操作中的应用感兴趣,比如使用updateWrapper的set方法,结合Lambda表达式来指定要更新的字段和值,特别是设置为NULL的情况。这时候可能需要使用`setSql`方法,或者直接set(字段, null),但需要注意MyBatis-Plus的版本是否支持。 还要考虑到动态条件拼接,比如在条件构造器中根据情况动态添加条件,避免SQL注入,同时保持代码的可读性。例如,使用LambdaQueryWrapper的链式调用,根据业务逻辑添加不同的条件。 需要检查是否有遗漏的常用Lambda用法,比如select方法指定查询字段,或者使用函数式方法如apply来添加自定义SQL片段。此外,关联查询的情况下如何使用Lambda表达式,但MyBatis-Plus本身对联表查询的支持有限,可能更多是单表操作。 最后,总结不同用法,并确保每个例子都符合MyBatis-Plus的实际API,语法正确。可能还需要比较Lambda表达式和普通Wrapper的优势,比如类型安全,避免字段名拼写错误,重构友好等。 现在需要组织这些思路,分点列出不同用法,并给出示例代码。同时,确保使用正确的格式,行内代码用$...$,独立代码块用```,并且引用相关的参考文献中的示例,比如设置字段为NULL的更新操作,可能引用用户提供的引用[1]中的例子,但需要适应MyBatis-Plus的语法。</think>### MyBatis-Plus中Lambda表达式用法详解 MyBatis-Plus的Lambda表达式通过类型安全的方式构建查询条件,避免直接操作数据库字段名的硬编码问题。以下是其核心用法: --- #### 一、基础条件构造 1. **等值查询** 使用`eq`方法实现等于条件: ```java LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getAge, 25); // WHERE age = 25 ``` 2. **不等值查询** 使用`ne`方法实现不等于条件: ```java wrapper.ne(User::getStatus, 0); // WHERE status != 0 ``` 3. **范围查询** - `between`:区间查询 ```java wrapper.between(User::getScore, 60, 90); // WHERE score BETWEEN 60 AND 90 ``` - `in`:包含值查询 ```java wrapper.in(User::getRole, Arrays.asList("admin", "editor")); // WHERE role IN ('admin','editor') ``` --- #### 二、Null值处理 1. **查询字段为Null** 使用`isNull`方法筛选字段为`NULL`的记录: ```java wrapper.isNull(User::getPhone); // WHERE phone IS NULL ``` 2. **查询字段非Null** 使用`isNotNull`方法过滤非空字段: ```java wrapper.isNotNull(User::getEmail); // WHERE email IS NOT NULL ``` 3. **更新字段为Null** 结合`UpdateWrapper`将字段设为`NULL`,类似于SQL的`UPDATE ... SET field=NULL`: ```java LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.set(User::getPhone, null) .eq(User::getUserId, 1); userMapper.update(null, updateWrapper); // UPDATE users SET phone = NULL WHERE user_id = 1 [^1] ``` --- #### 三、复杂条件组合 1. **嵌套条件(AND/OR)** 使用`and`和`or`方法实现逻辑组合: ```java wrapper.and(wp -> wp.gt(User::getAge, 18) .lt(User::getAge, 30)) .or(wp -> wp.eq(User::getStatus, 1)); // WHERE (age > 18 AND age < 30) OR status = 1 ``` 2. **动态条件拼接** 根据业务逻辑动态添加条件: ```java if (searchKey != null) { wrapper.like(User::getName, searchKey); // 动态添加模糊查询 } ``` --- #### 四、排序与分组 1. **排序** 使用`orderByAsc`/`orderByDesc`实现排序: ```java wrapper.orderByAsc(User::getCreateTime); // ORDER BY create_time ASC ``` 2. **分组** 结合`groupBy`和聚合函数: ```java wrapper.select(User::getRole, COUNT_STAR) .groupBy(User::getRole); // SELECT role, COUNT(*) FROM user GROUP BY role ``` --- #### 五、自定义SQL片段 通过`apply`方法插入自定义SQL(需注意SQL注入风险): ```java wrapper.apply("DATE(create_time) = '2023-01-01'"); // WHERE DATE(create_time) = '2023-01-01' ``` --- ### 优势对比 | 场景 | Lambda表达式写法 | 传统Wrapper写法 | |--------------------|----------------------------------|---------------------------------| | 字段名引用 | `User::getName` | `"name"` | | 类型安全 | 编译期检查字段是否存在 | 运行时可能因拼写错误导致异常 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值