## 一、什么是Lambda表达式 Lambda 表达式是 **Java 8 引入的核心特性**,它是一种**简洁、匿名、可传递的函数式代码块**,用于实现函数式编程范式。 #### Lambda表达式的本质 1、**匿名函数**:没有显式名称的函数实现 2、**函数式接口实例**:实现了只包含单个抽象方法的接口(函数式接口) 3、**代码即数据**:可作为参数传递或返回值 4、**类型推断**:编译器自动推断参数和返回类型 #### Lambda表达式的作用 ```javascript // 传统方式:匿名内部类 button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Button clicked!"); } }); // Lambda 表达式 button.addActionListener(e -> System.out.println("Button clicked!")); ``` Lambda 解决了**匿名内部类的模板代码问题**,使代码更简洁、可读性更强。 ## 二、语法结构 ```javascript (parameters) -> expression 或 (parameters) -> { statements; } ``` | 组件 | 说明 | 示例 | | -------------- | --------------------- | ------------------------------------------------------------------- | | **参数列表** | 输入参数 | `()` 无参`x` 单参(类型可省略)`(int x, String y)` 显式类型 | | **箭头运算符** | `->` 分隔参数与函数体 | 必须存在 | | **函数体** | 单表达式或代码块 | `x -> x*2``(x) -> { return x*2; }` | **例子** ```javascript // 1. 无参 Runnable r = () -> System.out.println("Hello"); // 2. 单参(类型推断) Consumer c = s -> System.out.println(s); // 3. 多参 Comparator comp = (a, b) -> a.compareTo(b); // 4. 多行代码块 Function cube = x -> { int result = x * x; return result * x; }; // 5. 显式类型(编译器无法推断时) BinaryOperator add = (Long x, Long y) -> x + y; ``` ## 三、与函数式接口的关系 Lambda 必须赋值给**函数式接口**(Functional Interface): * 仅包含**一个抽象方法**的接口 * 常用注解:`@FunctionalInterface` **常见内置函数式接口** | 接口 | 参数 | 返回类型 | 典型用法 | | ------------------- | ---- | -------- | ------------ | | `Consumer` | T | void | 接收参数处理 | | `Supplier` | 无 | T | 提供数据 | | `Function` | T | R | 类型转换 | | `Predicate` | T | boolean | 条件判断 | | `BiFunction` | T,U | R | 二元操作 | ```javascript // Lambda 赋值给函数式接口 Predicate isEmpty = s -> s.isEmpty(); // 在方法中使用 List nonEmpty = list.stream() .filter(s -> !s.isEmpty()) // Lambda 作为参数 .collect(Collectors.toList()); ``` ## 四、代码优势 #### 1、代码简洁性 ```javascript // 比较传统 vs Lambda Collections.sort(list, new Comparator() { public int compare(String s1, String s2) { return s1.length() - s2.length(); } }); Collections.sort(list, (s1, s2) -> s1.length() - s2.length()); ``` #### 2、函数式编程支持 ```javascript // 配合 Stream API long count = list.stream() .filter(s -> s.startsWith("A")) .count(); ``` #### 3、并行处理能力 ```javascript // 自动并行化 list.parallelStream() .map(s -> s.toUpperCase()) .forEach(System.out::println); ``` #### 4、延迟执行 ```javascript // Lambda 定义逻辑,延迟到需要时执行 Supplier randomSupplier = () -> Math.random(); System.out.println(randomSupplier.get()); // 实际调用时才计算 ``` ## 五、变量捕获规则 | 变量类型 | 可访问性 | 可修改性 | | -------- | -------------------------------------- | -------- | | 局部变量 | ✔️ 必须是 final 或 effectively final | ✘ | | 实例变量 | ✔️ | ✔️ | | 静态变量 | ✔️ | ✔️ | ## 六、与方法引用的区别 | 特性 | Lambda 表达式 | 方法引用 | | ---------- | ------------- | ---------------- | | 适用场景 | 复杂逻辑 | 直接调用现有方法 | | 语法灵活性 | 高 | 有限 | | 可读性 | 中等 | 高 | | 复用性 | 低 | 高 | Loading... ## 一、什么是Lambda表达式 Lambda 表达式是 **Java 8 引入的核心特性**,它是一种**简洁、匿名、可传递的函数式代码块**,用于实现函数式编程范式。 #### Lambda表达式的本质 1、**匿名函数**:没有显式名称的函数实现 2、**函数式接口实例**:实现了只包含单个抽象方法的接口(函数式接口) 3、**代码即数据**:可作为参数传递或返回值 4、**类型推断**:编译器自动推断参数和返回类型 #### Lambda表达式的作用 ```javascript // 传统方式:匿名内部类 button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Button clicked!"); } }); // Lambda 表达式 button.addActionListener(e -> System.out.println("Button clicked!")); ``` Lambda 解决了**匿名内部类的模板代码问题**,使代码更简洁、可读性更强。 ## 二、语法结构 ```javascript (parameters) -> expression 或 (parameters) -> { statements; } ``` | 组件 | 说明 | 示例 | | -------------- | --------------------- | ------------------------------------------------------------------- | | **参数列表** | 输入参数 | `()` 无参<br>`x` 单参(类型可省略)<br>`(int x, String y)` 显式类型 | | **箭头运算符** | `->` 分隔参数与函数体 | 必须存在 | | **函数体** | 单表达式或代码块 | `x -> x*2`<br>`(x) -> { return x*2; }` | **例子** ```javascript // 1. 无参 Runnable r = () -> System.out.println("Hello"); // 2. 单参(类型推断) Consumer<String> c = s -> System.out.println(s); // 3. 多参 Comparator<Integer> comp = (a, b) -> a.compareTo(b); // 4. 多行代码块 Function<Integer, Integer> cube = x -> { int result = x * x; return result * x; }; // 5. 显式类型(编译器无法推断时) BinaryOperator<Long> add = (Long x, Long y) -> x + y; ``` ## 三、与函数式接口的关系 Lambda 必须赋值给**函数式接口**(Functional Interface): * 仅包含**一个抽象方法**的接口 * 常用注解:`@FunctionalInterface` **常见内置函数式接口** | 接口 | 参数 | 返回类型 | 典型用法 | | ------------------- | ---- | -------- | ------------ | | `Consumer<T>` | T | void | 接收参数处理 | | `Supplier<T>` | 无 | T | 提供数据 | | `Function<T,R>` | T | R | 类型转换 | | `Predicate<T>` | T | boolean | 条件判断 | | `BiFunction<T,U,R>` | T,U | R | 二元操作 | ```javascript // Lambda 赋值给函数式接口 Predicate<String> isEmpty = s -> s.isEmpty(); // 在方法中使用 List<String> nonEmpty = list.stream() .filter(s -> !s.isEmpty()) // Lambda 作为参数 .collect(Collectors.toList()); ``` ## 四、代码优势 #### 1、代码简洁性 ```javascript // 比较传统 vs Lambda Collections.sort(list, new Comparator<String>() { public int compare(String s1, String s2) { return s1.length() - s2.length(); } }); Collections.sort(list, (s1, s2) -> s1.length() - s2.length()); ``` #### 2、函数式编程支持 ```javascript // 配合 Stream API long count = list.stream() .filter(s -> s.startsWith("A")) .count(); ``` #### 3、并行处理能力 ```javascript // 自动并行化 list.parallelStream() .map(s -> s.toUpperCase()) .forEach(System.out::println); ``` #### 4、延迟执行 ```javascript // Lambda 定义逻辑,延迟到需要时执行 Supplier<Double> randomSupplier = () -> Math.random(); System.out.println(randomSupplier.get()); // 实际调用时才计算 ``` ## 五、变量捕获规则 | 变量类型 | 可访问性 | 可修改性 | | -------- | -------------------------------------- | -------- | | 局部变量 | ✔️ 必须是 final 或 effectively final | ✘ | | 实例变量 | ✔️ | ✔️ | | 静态变量 | ✔️ | ✔️ | ## 六、与方法引用的区别 | 特性 | Lambda 表达式 | 方法引用 | | ---------- | ------------- | ---------------- | | 适用场景 | 复杂逻辑 | 直接调用现有方法 | | 语法灵活性 | 高 | 有限 | | 可读性 | 中等 | 高 | | 复用性 | 低 | 高 | 最后修改:2025 年 10 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。