qidao123.com技术社区-IT企服评测·应用市场
标题:
Java-Lambda 表达式
[打印本页]
作者:
温锦文欧普厨电及净水器总代理
时间:
2025-5-10 19:42
标题:
Java-Lambda 表达式
Lambda 表达式是 Java 8 引入的一项重要特性,它提供了一种简便的方式来表示匿名函数。Lambda 表达式重要用于简化函数式接口的实现,使代码更加简便和易读。以下是关于 Lambda 表达式的详细阐述:
1. Lambda 表达式的基本语法
Lambda 表达式的语法如下:
(parameter_list) -> { 代码块 }
复制代码
parameter_list:参数列表,可以包含零个或多个参数,参数类型可以省略(由编译器自动推断)。
->:Lambda 操纵符,将参数列表与 Lambda 主体分隔开。
代码块:Lambda 主体,包含实现函数式接口的代码。假如只有一行代码,可以省略 {} 和 return 语句。
示例:
// 无参数
() -> System.out.println("Hello, World!");
// 单个参数
(x) -> x * x;
// 多个参数
(x, y) -> x + y;
// 带代码块
(x, y) -> {
int sum = x + y;
return sum;
};
复制代码
2. 函数式接口
Lambda 表达式的核心是函数式接口(Functional Interface)。函数式接口是指
仅包含一个抽象方法
的接口。Java 提供了 @FunctionalInterface 注解来标记函数式接口。
常见的函数式接口:
Runnable:void run()
Consumer<T>:void accept(T t)
Supplier<T>:T get()
Function<T, R>:R apply(T t)
Predicate<T>:boolean test(T t)
示例:
@FunctionalInterface
interface MyInterface {
void doSomething();
}
// 使用 Lambda 表达式实现函数式接口
MyInterface myLambda = () -> System.out.println("Doing something");
myLambda.doSomething();
复制代码
好好领会一下,lambda式是一个函数,他赋值给一个接口变量,那么这个接口肯定要有一个抽象方法去实现,正好把lambda的这个函数赋值给这个未被重写的抽象类;而且这个接口肯定只能有一个未实现方法,为什么呢,因为假如有多个,谁也分不清晰给哪个方法;有点意思!
3. Lambda 表达式的使用场景
(1) 简化匿名内部类
Lambda 表达式可以替代匿名内部类,使代码更简便。
// 传统匿名内部类
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
};
// 使用 Lambda 表达式
Runnable r2 = () -> System.out.println("Hello, World!");
复制代码
注意:以上代码中Runnable 就只是一个普通的函数式接口,只是起到举例子的效果,可以更换成自定义函数式接口
(2) 遍历聚集
Lambda 表达式团结 forEach() 方法可以简化聚集的遍历操纵。
List<String> list = Arrays.asList("Apple", "Banana", "Orange");
// 传统遍历
for (String s : list) {
System.out.println(s);
}
// 使用 Lambda 表达式
list.forEach(s -> System.out.println(s));
复制代码
(3) 作为方法参数
Lambda 表达式可以作为方法参数传递,特殊适适用于必要回调函数的场景。
public static void processList(List<String> list, Consumer<String> consumer) {
for (String s : list) {
consumer.accept(s);
}
}
// 调用方法
processList(list, s -> System.out.println(s));
复制代码
(4) 团结 Stream API
Lambda 表达式与 Stream API 团结,可以实现强盛的数据处理功能,如过滤、映射、排序等。
List<String> fruits = Arrays.asList("Apple", "Banana", "Orange", "Mango");
// 过滤长度大于 5 的字符串
List<String> filtered = fruits.stream()
.filter(s -> s.length() > 5)
.collect(Collectors.toList());
// 将字符串转换为大写
List<String> upperCase = fruits.stream()
.map(s -> s.toUpperCase())
.collect(Collectors.toList());
复制代码
4. Lambda 表达式的变量作用域
Lambda 表达式可以访问外部的局部变量、实例变量和静态变量,但有如下限定:
局部变量
:Lambda 表达式访问的局部变量必须是 final 或实际上是 final 的(即不可变)。
实例变量和静态变量
:Lambda 表达式可以访问并修改实例变量和静态变量。
示例:
int num = 10; // 局部变量
Runnable r = () -> System.out.println(num); // num 必须是 final 或 effectively final
// 错误示例
int num2 = 20;
num2 = 30; // 修改 num2
Runnable r2 = () -> System.out.println(num2); // 编译错误:num2 必须是 final
复制代码
5. 方法引用
方法引用是 Lambda 表达式的一种简化情势,用于直接引用已有的方法。方法引用的语法如下:
类名::方法名
复制代码
方法引用的四种情势:
静态方法引用
:ClassName::staticMethod
实例方法引用
:instance::instanceMethod
特定类型的任意对象方法引用
:ClassName::instanceMethod
构造方法引用
:ClassName::new
示例:
List<String> list = Arrays.asList("Apple", "Banana", "Orange");
// 使用 Lambda 表达式
list.forEach(s -> System.out.println(s));
// 使用方法引用
list.forEach(System.out::println);
复制代码
好好明白上面的例子,还挺故意思,但是挺无聊;
感觉就是,有一个类他有很多方法,但是我就想要他的其中一个方法。。。。就是为了这个;
6. 注意事项
简便性
:Lambda 表达式应尽量保持简便,避免过于复杂的逻辑。
可读性
:假如 Lambda 表达式过长或逻辑复杂,应思量使用定名方法代替。
性能
:Lambda 表达式的性能与传统方式相称,但在某些情况下可能会有轻微的开销。
总结
Lambda 表达式是 Java 8 引入的一项重要特性,它通过简化函数式接口的实现,使代码更加简便和易读。Lambda 表达式广泛应用于聚集遍历、Stream API、回调函数等场景。把握 Lambda 表达式及其相关特性(如方法引用、函数式接口),可以明显提升 Java 开发效率和代码质量。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4