Java QueryWrapper Lambda 在 List 中的应用

在 Java 开发中,我们常常需要对数据集合进行筛选、排序和其他操作。若使用 MyBatis-Plus 作为 ORM 框架,QueryWrapper 提供了丰富的方法使得对数据库的操作更加简捷。而 Lambda 表达式使得代码更加优雅。在本文中,我们将深入探讨如何使用 MyBatis-Plus 的 QueryWrapper 和 Lambda 表达式来过滤 List 中的数据,并附上相关代码示例。

什么是 MyBatis-Plus 和 QueryWrapper

MyBatis-Plus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上提供了许多方便快捷的功能,减少了大量的样板代码。其中 QueryWrapper 是非常实用的一个类,允许用户以类似 SQL 的方式构建查询条件,同时能够做到链式调用。

安装 MyBatis-Plus

首先,确保在你的项目中引入了 MyBatis-Plus。如果你正在使用 Maven,可以在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

使用 QueryWrapper Lambda 查询 List

示例场景

假设我们有一个用户类 User,它包含以下属性:

  • id (Long)
  • name (String)
  • age (Integer)
  • email (String)

我们希望通过传入的筛选条件来查询用户列表,如筛选出年龄大于等于 18 岁且 email 包含 "@example.com" 的用户。

User 实体类

public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;

    // Getter 和 Setter 省略
}

示例代码

接下来是具体的实现。首先,假设我们有一个用户列表,我们希望在这个列表中进行筛选。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.ArrayList;
import java.util.List;

public class UserService {

    public List<User> filterUsers(List<User> users) {
        // 使用 LambdaQueryWrapper
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();

        // 筛选条件:年龄大于等于 18 且 email 中包含 "@example.com"
        queryWrapper.ge(User::getAge, 18)
                    .like(User::getEmail, "@example.com");

        // 进行过滤
        List<User> filteredUsers = new ArrayList<>();
        for (User user : users) {
            // 使用 Lambda 表达式进行条件检查
            if (queryWrapper.test(user)) {
                filteredUsers.add(user);
            }
        }

        return filteredUsers;
    }
}

代码解析

在上面的代码示例中,我们定义了一个 filterUsers 方法,它接受一个 User 对象的列表。我们通过 LambdaQueryWrapper 定义了过滤条件:

  • ge(User::getAge, 18): 年龄大于等于 18。
  • like(User::getEmail, "@example.com"): Email 包含 "@example.com"。

接着,我们遍历用户列表,通过 queryWrapper.test(user) 方法检查每个用户是否符合条件,并将符合条件的用户添加到 filteredUsers 列表中。

状态图

为了更清晰地展示 filterUsers 方法的执行流程,我们可以使用状态图。

stateDiagram-v2
    [*] --> Start
    Start --> CheckUser
    CheckUser -->|符合条件| AddUser
    CheckUser -->|不符合条件| NextUser
    AddUser --> NextUser
    NextUser --> CheckUser
    CheckUser -->|没有更多用户| End
    End --> [*]

使用示例

这个方法可以这样使用:

public class Main {
    public static void main(String[] args) {
        User user1 = new User(1L, "Alice", 22, "alice@example.com");
        User user2 = new User(2L, "Bob", 17, "bob@example.com");
        User user3 = new User(3L, "Charlie", 20, "charlie@gmail.com");
        
        List<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        users.add(user3);
        
        UserService userService = new UserService();
        List<User> filteredUsers = userService.filterUsers(users);
        
        for (User user : filteredUsers) {
            System.out.println(user.getName()); // Alice
        }
    }
}

在以上示例中,我们创建了 3 个用户,然后调用 filterUsers 方法来筛选符合条件的用户,并打印出来。

总结

通过以上的介绍,我们了解了如何利用 MyBatis-Plus 的 QueryWrapper 和 Lambda 表达式在 List 中进行数据筛选。通过这种方式,我们不仅可以提高代码的可读性,还能够减少大量的样板代码,使得业务逻辑更加清晰。

在 Java 开发中,掌握这类工具和技术可以大大提高开发效率。在今后的开发中,希望大家能够灵活应用 QueryWrapper 和 Lambda 表达式,使得数据处理更为高效。