Java-Lambda 表达式

打印 上一主题 下一主题

主题 1891|帖子 1891|积分 5673

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Lambda 表达式是 Java 8 引入的一项重要特性,它提供了一种简便的方式来表示匿名函数。Lambda 表达式重要用于简化函数式接口的实现,使代码更加简便和易读。以下是关于 Lambda 表达式的详细阐述:

1. Lambda 表达式的基本语法

Lambda 表达式的语法如下:
  1. (parameter_list) -> { 代码块 }
复制代码


  • parameter_list:参数列表,可以包含零个或多个参数,参数类型可以省略(由编译器自动推断)。
  • ->:Lambda 操纵符,将参数列表与 Lambda 主体分隔开。
  • 代码块:Lambda 主体,包含实现函数式接口的代码。假如只有一行代码,可以省略 {} 和 return 语句。
示例:

  1. // 无参数
  2. () -> System.out.println("Hello, World!");
  3. // 单个参数
  4. (x) -> x * x;
  5. // 多个参数
  6. (x, y) -> x + y;
  7. // 带代码块
  8. (x, y) -> {
  9.     int sum = x + y;
  10.     return sum;
  11. };
复制代码

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)
示例:

  1. @FunctionalInterface
  2. interface MyInterface {
  3.     void doSomething();
  4. }
  5. // 使用 Lambda 表达式实现函数式接口
  6. MyInterface myLambda = () -> System.out.println("Doing something");
  7. myLambda.doSomething();
复制代码
好好领会一下,lambda式是一个函数,他赋值给一个接口变量,那么这个接口肯定要有一个抽象方法去实现,正好把lambda的这个函数赋值给这个未被重写的抽象类;而且这个接口肯定只能有一个未实现方法,为什么呢,因为假如有多个,谁也分不清晰给哪个方法;有点意思!

3. Lambda 表达式的使用场景

(1) 简化匿名内部类

Lambda 表达式可以替代匿名内部类,使代码更简便。
  1. // 传统匿名内部类
  2. Runnable r1 = new Runnable() {
  3.     @Override
  4.     public void run() {
  5.         System.out.println("Hello, World!");
  6.     }
  7. };
  8. // 使用 Lambda 表达式
  9. Runnable r2 = () -> System.out.println("Hello, World!");
复制代码
注意:以上代码中Runnable 就只是一个普通的函数式接口,只是起到举例子的效果,可以更换成自定义函数式接口
(2) 遍历聚集

Lambda 表达式团结 forEach() 方法可以简化聚集的遍历操纵。
  1. List<String> list = Arrays.asList("Apple", "Banana", "Orange");
  2. // 传统遍历
  3. for (String s : list) {
  4.     System.out.println(s);
  5. }
  6. // 使用 Lambda 表达式
  7. list.forEach(s -> System.out.println(s));
复制代码
(3) 作为方法参数

Lambda 表达式可以作为方法参数传递,特殊适适用于必要回调函数的场景。
  1. public static void processList(List<String> list, Consumer<String> consumer) {
  2.     for (String s : list) {
  3.         consumer.accept(s);
  4.     }
  5. }
  6. // 调用方法
  7. processList(list, s -> System.out.println(s));
复制代码
(4) 团结 Stream API

Lambda 表达式与 Stream API 团结,可以实现强盛的数据处理功能,如过滤、映射、排序等。
  1. List<String> fruits = Arrays.asList("Apple", "Banana", "Orange", "Mango");
  2. // 过滤长度大于 5 的字符串
  3. List<String> filtered = fruits.stream()
  4.                               .filter(s -> s.length() > 5)
  5.                               .collect(Collectors.toList());
  6. // 将字符串转换为大写
  7. List<String> upperCase = fruits.stream()
  8.                                .map(s -> s.toUpperCase())
  9.                                .collect(Collectors.toList());
复制代码

4. Lambda 表达式的变量作用域

Lambda 表达式可以访问外部的局部变量、实例变量和静态变量,但有如下限定:

  • 局部变量:Lambda 表达式访问的局部变量必须是 final 或实际上是 final 的(即不可变)。
  • 实例变量和静态变量:Lambda 表达式可以访问并修改实例变量和静态变量。
示例:

  1. int num = 10; // 局部变量
  2. Runnable r = () -> System.out.println(num); // num 必须是 final 或 effectively final
  3. // 错误示例
  4. int num2 = 20;
  5. num2 = 30; // 修改 num2
  6. Runnable r2 = () -> System.out.println(num2); // 编译错误:num2 必须是 final
复制代码

5. 方法引用

方法引用是 Lambda 表达式的一种简化情势,用于直接引用已有的方法。方法引用的语法如下:
  1. 类名::方法名
复制代码
方法引用的四种情势:


  • 静态方法引用:ClassName::staticMethod
  • 实例方法引用:instance::instanceMethod
  • 特定类型的任意对象方法引用:ClassName::instanceMethod
  • 构造方法引用:ClassName::new
示例:

  1. List<String> list = Arrays.asList("Apple", "Banana", "Orange");
  2. // 使用 Lambda 表达式
  3. list.forEach(s -> System.out.println(s));
  4. // 使用方法引用
  5. list.forEach(System.out::println);
复制代码
好好明白上面的例子,还挺故意思,但是挺无聊;
感觉就是,有一个类他有很多方法,但是我就想要他的其中一个方法。。。。就是为了这个;

6. 注意事项


  • 简便性:Lambda 表达式应尽量保持简便,避免过于复杂的逻辑。
  • 可读性:假如 Lambda 表达式过长或逻辑复杂,应思量使用定名方法代替。
  • 性能:Lambda 表达式的性能与传统方式相称,但在某些情况下可能会有轻微的开销。

总结

Lambda 表达式是 Java 8 引入的一项重要特性,它通过简化函数式接口的实现,使代码更加简便和易读。Lambda 表达式广泛应用于聚集遍历、Stream API、回调函数等场景。把握 Lambda 表达式及其相关特性(如方法引用、函数式接口),可以明显提升 Java 开发效率和代码质量。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表