【Java 8】Lambda表达式介绍

目录

1、Lambda简介

2、语法介绍

3、Lambda表达式示例

[3.1、无参数的 Lambda 表达式](#3.1、无参数的 Lambda 表达式)

[3.2、单个参数的 Lambda 表达式](#3.2、单个参数的 Lambda 表达式)

[3.3、多个参数的 Lambda 表达式](#3.3、多个参数的 Lambda 表达式)

[3.4、带语句块的 Lambda 表达式](#3.4、带语句块的 Lambda 表达式)

4、Lambda使用场景

4.1、替代匿名内部类

4.2、集合操作

4.3、排序

4.4、函数式接口

4.4.1、自定义函数式接口

4.4.2、常用内置函数式接口

4.5、方法引用

4.5.1、静态方法引用

4.5.2、实例方法引用

4.5.3、构造方法引用

[5、Lambda 表达式的变量作用域](#5、Lambda 表达式的变量作用域)

[6、Lambda 表达式的限制](#6、Lambda 表达式的限制)

7、总结


1、Lambda简介

Java 8 引入了 Lambda 表达式,这是 Java 语言的一个重要特性,使得代码更加简洁和易读。Lambda 表达式允许你将功能作为方法参数传递,或者将代码作为数据来处理。

2、语法介绍

java 复制代码
(parameters) -> expression

或者

java 复制代码
(parameters) -> { statements; }
  • parameters: 参数列表,可以为空或包含一个或多个参数。

  • ->: Lambda 操作符,将参数和表达式或语句块分开。

  • expression: 单个表达式,Lambda 表达式会返回该表达式的结果。

  • { statements; } : 语句块,可以包含多条语句,需要使用 return 语句返回值(如果有返回值)。

3、Lambda表达式示例

3.1、无参数的 Lambda 表达式

java 复制代码
() -> System.out.println("Hello, World!");

3.2、单个参数的 Lambda 表达式

java 复制代码
x -> x * x

3.3、多个参数的 Lambda 表达式

java 复制代码
(x, y) -> x + y

3.4、带语句块的 Lambda 表达式

java 复制代码
(x, y) -> {
    int sum = x + y;
    return sum;
}

4、Lambda使用场景

4.1、替代匿名内部类

Lambda 表达式常用于替代匿名内部类,尤其是在使用函数式接口时。

java 复制代码
// 使用匿名内部类
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, World!");
    }
};

// 使用 Lambda 表达式
Runnable r2 = () -> System.out.println("Hello, World!");

4.2、集合操作

Lambda 表达式可以与 Java 8 引入的 Stream API 结合使用,简化集合操作。

java 复制代码
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 使用 Lambda 表达式遍历集合
names.forEach(name -> System.out.println(name));

// 使用 Lambda 表达式过滤集合
List<String> filteredNames = names.stream()
                                  .filter(name -> name.startsWith("A"))
                                  .collect(Collectors.toList());

4.3、排序

Lambda 表达式可以简化排序操作。

java 复制代码
List<String> names = Arrays.asList("Charlie", "Alice", "Bob");

// 使用 Lambda 表达式排序
names.sort((a, b) -> a.compareTo(b));

4.4、函数式接口

Lambda 表达式通常与函数式接口一起使用。函数式接口是只包含一个抽象方法的接口。Java 8 提供了许多内置的函数式接口,如 Runnable、Callable、Comparator 等。

4.4.1、自定义函数式接口

你可以定义自己的函数式接口,然后使用表达式实现。

java 复制代码
@FunctionalInterface
interface MyFunctionalInterface {
    void myMethod();
}


MyFunctionalInterface mfi = () -> System.out.println("My Method");
mfi.myMethod();

4.4.2、常用内置函数式接口

  • Predicate<T>: 接受一个参数并返回一个布尔值。

  • Consumer<T>: 接受一个参数并执行操作,不返回任何结果。

  • Function<T, R>: 接受一个参数并返回一个结果。

  • Supplier<T>: 不接受参数,返回一个结果。

4.5、方法引用

方法引用是 Lambda 表达式的一种简化形式,用于直接引用已有方法。

4.5.1、静态方法引用

java 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(System.out::println);

4.5.2、实例方法引用

java 复制代码
String str = "Hello";
Supplier<Integer> lengthSupplier = str::length;
System.out.println(lengthSupplier.get());

4.5.3、构造方法引用

java 复制代码
Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();

5、Lambda 表达式的变量作用域

Lambda 表达式可以访问外部的局部变量,但这些变量必须是 final 或事实上是 final 的(即不可变)。

java 复制代码
int num = 10;
Runnable r = () -> System.out.println(num); // num 必须是 final 或事实上是 final

6、Lambda 表达式的限制

  • Lambda 表达式只能用于函数式接口。

  • Lambda 表达式不能包含 break 或 continue 语句。

  • Lambda 表达式不能抛出检查异常(除非函数式接口允许)。

7、总结

Java 8 的 Lambda 表达式极大地简化了代码,使得函数式编程在 Java 中变得更加容易。通过 Lambda 表达式,你可以编写更简洁、更易读的代码,尤其是在处理集合、多线程和事件驱动编程时。

相关推荐
魔都吴所谓几秒前
【Python】 多线程 & 多进程&协程 常见题 + 应用场景整理
开发语言·python
Irene199110 分钟前
Flink 学习日志 01:前端转大数据的实战避坑指南
java·jvm·flink
Thomas.Sir11 分钟前
第1课:SpringBoot 4.x 快速上手:新特性、环境准备与第一个HelloWorld程序
java·spring boot
king135987455014 分钟前
LiteRT Tensor API:C++ 编写端侧模型图,XNNPACK、GPU 与 NPU 怎么选?
开发语言·c++·人工智能·chatgpt·架构·aigc
geovindu15 分钟前
rust: Template Method Pattern(续)
开发语言·后端·设计模式·rust·行为模式·板方法模式
外收内放17 分钟前
面向对象高级(封装)
开发语言·python
devilnumber30 分钟前
Java 内部迭代 vs 外部迭代:从原理到实战避坑
java·开发语言
杨运交36 分钟前
080-缓存模块-Spring Cache缓存键前缀设计与租户隔离实践
java·spring·缓存
学逆向的38 分钟前
C printf原型解析
c语言·开发语言·网络安全
\光辉岁月/40 分钟前
5.math类
java·开发语言