2023了你还没用Lambda?

2023-09-19 19:45:43 浏览数 (2)

背景

在Java编程中,集合操作是非常常见的需求。

传统的方式是使用匿名内部类,但是这种方式代码冗长、难以阅读和维护。

2014年Java 8 引入了Lambda表达式,使得我们可以更加简洁、易读地编写集合操作代码。

Lambda表达式已经成为Java编程中不可缺少的一部分,它简化了Java编程的很多操作,提高了代码的可读性和可维护性。

今天了不起就和大家简单的聊聊lambda的使用。

Lambda的诞生

Lambda表达式是一种匿名函数,它可以作为参数传递给方法或存储在变量中。

Lambda表达式通常用于函数式编程,其中函数是一等公民,可以像变量一样进行传递和使用。

Lambda表达式的语法如下:

代码语言:javascript复制
(parameters) -> expression

代码语言:javascript复制
(parameters) -> { statements; }

其中,parameters 是参数列表,可以没有参数或多个参数;

expression 是单个表达式,可以是方法调用、变量或常量等;

statements 是一个代码块,可以包含多个语句。

Lambda的基础API介绍

Filter

Lambda表达式可以用于筛选集合中符合条件的元素。

使用filter方法来过滤集合中的元素。

以下是一个使用Lambda表达式筛选List中偶数的例子:

代码语言:javascript复制
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenList = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());

上述代码使用stream方法获取List的流,并使用filter方法过滤出List中的偶数元素,最后使用collect方法将过滤结果转换为List。

Map

Lambda表达式可以用于转换集合中的元素。

使用map方法来转换集合中的元素。

以下是一个使用Lambda表达式将List中的元素转换为它们的平方数的例子:

代码语言:javascript复制
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squareList = list.stream().map(n -> n * n).collect(Collectors.toList());

上述代码使用stream方法获取List的流,并使用map方法将List中的元素转换为它们的平方数,最后使用collect方法将转换结果转换为List。

Stream

Lambda表达式可以用于遍历集合并对集合元素进行操作。

使用forEach方法来遍历集合。

以下是一个使用Lambda表达式遍历List的例子:

代码语言:javascript复制
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.forEach(n -> System.out.println(n));

上述代码使用forEach方法遍历List中的元素,并使用Lambda表达式将每个元素输出到控制台。

组合使用

Lambda表达式可以组合使用filter、map、stream等API,以实现更加复杂的操作。

以下是一个使用Lambda表达式组合filter、map、stream实现从List中筛选出偶数并计算它们的平方和的例子:

代码语言:javascript复制
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().filter(n -> n % 2 == 0).map(n -> n * n).reduce(0, Integer::sum);

上述代码使用stream方法获取List的流,并使用filter方法过滤出List中的偶数元素,使用map方法将偶数元素转换为它们的平方数,最后使用reduce方法计算平方和。

Lambda常见应用场景

Lambda 表达式可以用于对集合、数据库等进行操作,以下是一些常见的应用场景:

集合操作

Lambda 表达式可以用于对集合进行筛选、转换、计算和遍历等操作。

通过使用 Stream 接口提供的 filter、map、reduce 和 forEach 等方法,可以方便地对集合进行操作,提高代码的可读性和可维护性。

代码语言:javascript复制
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

// 使用 Lambda 表达式筛选 List 中偶数
List<Integer> evenList = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());

// 使用 Lambda 表达式将 List 中的元素转换为它们的平方数
List<Integer> squareList = list.stream().map(n -> n * n).collect(Collectors.toList());

// 使用 Lambda 表达式计算 List 中所有元素的和
int sum = list.stream().reduce(0, (a, b) -> a   b);

// 使用 Lambda 表达式遍历 List
list.forEach(n -> System.out.println(n));

GUI编程

在 GUI 编程中,Lambda 表达式可以用于简化事件处理代码。

在传统的事件处理方式中,需要创建一个匿名内部类来实现事件监听器,这种方式代码冗长、难以阅读和维护。

使用 Lambda 表达式可以使事件处理代码更加简洁、易读。

代码语言:javascript复制
// 使用 Lambda 表达式简化事件处理代码
button.addActionListener(e -> {
    // 处理事件
});

多线程编程

Lambda 表达式可以用于简化多线程编程的代码。

在传统的多线程编程中,需要创建一个实现 Runnable 接口的匿名内部类,这种方式代码冗长、难以阅读和维护。

使用 Lambda 表达式可以使多线程编程代码更加简洁、易读。

代码语言:javascript复制
// 使用 Lambda 表达式简化多线程编程代码
Thread thread = new Thread(() -> {
    // 处理多线程任务
});
thread.start();

函数式编程

Lambda 表达式是函数式编程的核心,它可以用于定义和传递函数。

函数式编程是一种编程范式,它将计算机程序看作是一系列函数的组合。

Lambda 表达式可以用于定义函数,将函数作为参数传递给其他函数,或将函数作为返回值返回。

代码语言:javascript复制
// 使用 Lambda 表达式定义函数
Function<Integer, Integer> square = x -> x * x;

// 将函数作为参数传递给其他函数
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squareList = list.stream().map(square).collect(Collectors.toList());

// 将函数作为返回值返回
Function<Integer, Function<Integer, Integer>> add = x -> y -> x   y;
int result = add.apply(1).apply(2); // result = 3

数据库操作

Lambda 表达式可以用于简化数据库操作。

代码语言:javascript复制
// 使用 Lambda 表达式简化 MyBatis-Plus 数据库操作代码
List<User> userList = userService.list(new LambdaQueryWrapper<User>()
        .eq(User::getGender, 1)
        .lt(User::getAge, 30)
        .orderByDesc(User::getCreateTime)
        .last("LIMIT 10")
);

在上面的代码中,我们使用 Lambda 表达式构建了一个 LambdaQueryWrapper 对象,通过它可以方便地构建复杂的查询条件,包括等于、大于、小于、模糊匹配等各种条件,同时也支持排序、分页等功能。

其中,eq() 方法表示等于,lt() 方法表示小于,orderByDesc() 方法表示按照指定字段降序排序,last() 方法表示在 SQL 语句的最后添加额外的字符串。

通过使用 LambdaQueryWrapper,我们可以更加方便地构建复杂的查询条件,同时也可以避免手写 SQL 语句带来的安全风险。

Web编程

在 Web 编程中,Lambda 表达式可以用于简化请求处理代码。在传统的请求处理方式中,需要创建一个实现 HttpServlet 接口的匿名内部类,这种方式代码冗长、难以阅读和维护。

使用 Lambda 表达式可以使请求处理代码更加简洁、易读。

代码语言:javascript复制
// 使用 Lambda 表达式简化请求处理代码
@WebServlet(urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("Hello, world!");
    }
}

注意事项

在使用Lambda表达式时,需要注意以下几点:

  • Lambda表达式只能用于函数式接口。
  • Lambda表达式的参数类型可以省略,编译器会自动推断类型。
  • Lambda表达式的方法体可以是一个表达式或一个代码块。
  • Lambda表达式中的变量必须是final或effectively final的。
  • Lambda表达式中不能使用this和super关键字。

使用建议

在编写Java程序时,应尽可能地使用Lambda表达式,以提高程序的可读性和可维护性。

在使用Lambda表达式时,应注意遵循Java编码规范,避免出现不必要的语法错误。

总结

在Java编程中,Lambda 已经成为一个不可或缺的工具,掌握它的使用方法对于Java程序员来说非常重要。

Lambda表达式是Java8中引入的一种函数式编程特性,它可以使代码更加简洁、易读。

Lambda表达式常用于集合操作、数据库操作等场景。

在使用Lambda表达式时,需要注意遵循Java编码规范并避免出现语法错误。

了不起今天就和大家聊这么多了,接下来你应该会使用Lambda表达式了,用它还是使得我们代码看起来更简单。

0 人点赞