
目录一、前置知识函数式接口1. 定义2. 标识注解3. Java 内置常用函数式接口重点二、Lambda 基础语法1. 完整语法格式2. 语法简化规则核心考点规则 1参数列表简化规则 2方法体简化3. 语法总结从繁到简三、基础使用示例示例 1替代无参匿名内部类示例 2单参数 消费接口 Consumer示例 3有参有返回 Function示例 4布尔判断 Predicate示例 5无参有返回 Supplier四、Lambda 作用域 变量规则1. 可访问成员变量、静态变量2. 局部变量限制重点3. 不能使用 this五、Lambda 结合集合实战高频1. 集合遍历 forEach2. 集合排序 sort3. 结合 Stream 过滤、映射工作最常用六、方法引用Lambda 进阶简写四种常用方法引用七、Lambda 优缺点 使用场景优点缺点适用场景八、常见误区总结Lambda 是Java 8 核心新特性本质是简化匿名内部类用来表示可传递的匿名函数无名称、无访问修饰符、无返回值声明常结合函数式接口使用让代码更简洁、偏向函数式编程。一、前置知识函数式接口Lambda只能作用于函数式接口这是使用前提。1. 定义函数式接口有且仅有一个抽象方法的接口可以包含默认方法、静态方法、Object 类重写方法。2. 标识注解FunctionalInterface可选建议加上编译期校验保证接口只有一个抽象方法。FunctionalInterface public interface MyFunc { // 唯一抽象方法 void say(); }3. Java 内置常用函数式接口重点Java 8 提供四大核心接口日常开发高频使用接口抽象方法作用ConsumerTvoid accept(T t)消费型有参无返回值SupplierTT get()供给型无参有返回值FunctionT,RR apply(T t)函数型有参有返回值PredicateTboolean test(T t)断定型有参返回布尔值二、Lambda 基础语法1. 完整语法格式(参数列表) - { 方法体 }拆解(参数列表)对应函数式接口抽象方法的参数可省略类型编译器类型推断-Lambda 操作符分隔参数和方法体{ 方法体 }方法实现逻辑2. 语法简化规则核心考点根据参数个数、返回值、方法体行数逐步简写共 4 种场景规则 1参数列表简化参数类型可全部省略编译器自动推断只有一个参数时()括号可以省略// 原写法 (String s) - { System.out.println(s); } // 简化1省略参数类型 (s) - { System.out.println(s); } // 简化2单参省略括号 s - { System.out.println(s); }规则 2方法体简化方法体只有一行代码{}大括号可以省略若单行是return 语句{}和return必须一起省略// 多行方法体必须保留大括号 (int a, int b) - { int sum a b; System.out.println(sum); } // 单行方法体省略大括号 (a, b) - System.out.println(a b); // 单行 return 返回省略 {} return // 原(a,b) - { return ab; } (a, b) - a b;3. 语法总结从繁到简完整形态(参数1, 参数2) - { 多行代码 }省略参数类型(a, b) - { 多行代码 }单参省略括号a - { 多行代码 }单行代码省略大括号a - 单行语句单行返回省略 returna,b - 表达式三、基础使用示例示例 1替代无参匿名内部类传统匿名内部类new Thread(new Runnable() { Override public void run() { System.out.println(传统写法); } }).start();Lambda 简化Runnable是函数式接口new Thread(() - System.out.println(Lambda写法)).start();示例 2单参数 消费接口 Consumer// 传统 ConsumerString con new ConsumerString() { Override public void accept(String s) { System.out.println(s); } }; con.accept(测试); // Lambda 最简写法 ConsumerString con2 s - System.out.println(s); con2.accept(Lambda 消费接口);示例 3有参有返回 Function// 功能字符串转长度 FunctionString, Integer func s - s.length(); Integer len func.apply(hello); System.out.println(len); // 5示例 4布尔判断 Predicate// 判断数字是否大于10 PredicateInteger pre num - num 10; System.out.println(pre.test(15)); // true System.out.println(pre.test(5)); // false示例 5无参有返回 Supplier// 生成随机数 SupplierDouble sup () - Math.random(); System.out.println(sup.get());四、Lambda 作用域 变量规则1. 可访问成员变量、静态变量无限制正常读写。2. 局部变量限制重点Lambda引用局部变量时变量会被隐式视为 finalJava 8 及以后不用手动写 final但不能二次赋值一旦重新赋值直接编译报错示例int num 10; // Lambda 引用局部变量 num Runnable r () - System.out.println(num); // num 20; // 报错隐式 final禁止修改原因Lambda 可能延迟执行防止变量值被篡改保证数据一致性。3. 不能使用 thisLambda没有独立的 this它的this和外层调用者的 this 完全一致和匿名内部类不同。五、Lambda 结合集合实战高频Lambda 最大价值简化Collection 遍历、过滤、排序配合 Stream 流使用。1. 集合遍历 forEachListString list Arrays.asList(Java, Lambda, Stream); // 传统增强for for (String s : list) { System.out.println(s); } // Lambda 遍历forEach 接收 Consumer list.forEach(s - System.out.println(s));2. 集合排序 sortListInteger numList Arrays.asList(3,1,4,2); // 传统比较器 Collections.sort(numList, new ComparatorInteger() { Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); // Lambda 简化排序 numList.sort((o1, o2) - o1 - o2); System.out.println(numList); // [1, 2, 3, 4]3. 结合 Stream 过滤、映射工作最常用ListString list Arrays.asList(张三,李四,张三丰,王五); // 过滤名字长度2 的元素 遍历 list.stream() .filter(s - s.length() 2) // Predicate 过滤 .forEach(s - System.out.println(s));六、方法引用Lambda 进阶简写当 Lambda 方法体只是调用一个已有方法可以用方法引用进一步简化属于 Lambda 的语法糖。 格式类名/对象::方法名四种常用方法引用对象实例方法ConsumerString c System.out::println; c.accept(方法引用);类静态方法FunctionInteger, String f String::valueOf;类实例方法类构造方法SupplierPerson sup Person::new;七、Lambda 优缺点 使用场景优点大幅简化匿名内部类代码代码更简洁紧凑配合 Stream 流集合操作遍历、过滤、分组效率极高支持函数式编程代码风格更灵活缺点可读性下降复杂逻辑不建议使用多层嵌套 Lambda 难以维护无法调试Lambda 没有方法名断点调试不如普通方法直观不能使用this、不能抛出受检异常需额外处理适用场景简短的回调、线程、比较器、集合遍历 / 过滤函数式接口、Stream 流式计算不适用逻辑复杂、多行业务代码、需要频繁调试的场景。八、常见误区总结❌ Lambda 可以脱离函数式接口使用 →必须依赖函数式接口❌ Lambda 有独立的 class 文件 → 不会生成额外 class运行时动态生成❌ Lambda 可以修改外部局部变量 → 局部变量隐式 final禁止修改❌ 接口有多个抽象方法也能用 Lambda → 必须仅有一个抽象方法