背景
在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表达式了,用它还是使得我们代码看起来更简单。