Java学习笔记——lambda表达式
Lambda表达式详解及在Java中的应用
Lambda表达式是什么?
Lambda表达式是Java 8引入的核心特性,它是一种简洁的函数式编程语法结构,本质上是匿名的函数实现。它允许你将函数作为方法参数传递,或者将代码当作数据处理。
基本语法:
(parameters) -> expression
(parameters) -> { statements; }
示例对比(过滤数字):
// 传统匿名类
List<Integer> result = list.stream().filter(new Predicate<Integer>() {@Overridepublic boolean test(Integer num) {return num > 10;}}).collect(Collectors.toList());// Lambda表达式
List<Integer> result = list.stream().filter(num -> num > 10).collect(Collectors.toList());
Lambda表达式可以实现什么功能?
- 替代匿名内部类:简洁实现函数式接口
- 行为参数化:将代码逻辑作为参数传递
- 函数组合:创建小型、可复用的代码单元
- 流式操作:配合Stream API进行数据处理
- 事件处理:简化回调函数和事件监听器
函数式接口与Lambda的关系
函数式接口(Functional Interface)
- 只有一个抽象方法的接口(可以有多个default方法)
- 用
@FunctionalInterface
注解标记(非必须但推荐) - 常用内置接口:
// 无输入,返回T Supplier<T> // T get()// 接受T,无返回 Consumer<T> // void accept(T t)// 接受T,返回boolean Predicate<T> // boolean test(T t)// 接受T,返回R Function<T, R> // R apply(T t)// 接受两个输入 BiFunction<T, U, R> // R apply(T t, U u)
关系说明
Lambda表达式是函数式接口的实例实现。编译器根据上下文自动匹配Lambda表达式到对应的函数式接口。
// Lambda自动匹配到Function接口
Function<String, Integer> strLength = s -> s.length();// 等同于匿名类实现
Function<String, Integer> strLength = new Function<>() {@Overridepublic Integer apply(String s) {return s.length();}
};
函数式编程与Lambda的关系
- Lambda是函数式编程的基础工具:实现了Java中函数作为一等公民
- 支持高阶函数:以函数作为参数或返回值
// 高阶函数示例 Function<Function<String, Integer>, Integer> highOrder = func -> func.apply("hello") * 2;
- 实现纯函数:无副作用的运算,相同输入永远相同输出
- 支持闭包:捕获自由变量(需要
final
或等效final)int factor = 2; // 等效final Function<Integer, Integer> multiplier = n -> n * factor;
函数式编程的好处
- 简洁性:减少样板代码(如匿名类)
- 可读性:更接近自然语言的链式调用
- 并行友好:无状态操作便于并行处理
// 并行处理示例 List<Integer> result = data.parallelStream().filter(n -> n % 2 == 0).map(n -> n * 2).collect(Collectors.toList());
- 延迟执行:支持惰性求值,优化性能
- 易于测试:纯函数不依赖外部状态
Lambda高级语法特性
-
方法引用:
// 静态方法引用 Function<String, Integer> parser = Integer::parseInt;// 实例方法引用 Consumer<String> printer = System.out::println;// 构造函数引用 Supplier<List<String>> listSupplier = ArrayList::new;
-
类型推断:省略类型声明
// 编译器可推断参数类型 Function<String, String> toUpper = s -> s.toUpperCase();
-
多参数和可变参数:
// 多参数 BiFunction<Integer, Integer