Java 巩固进阶 · 第 25 天主题Lambda 表达式 —— 函数式编程入门 进度概览恭喜完成Java 基础巩固阶段1-24 天从今天起进入JDK8 新特性阶段。Lambda 是 Java 函数式编程的基石也是后续学习 Stream 流、Optional 乃至 Spring 函数式接口的 prerequisite。 核心价值代码简洁消除匿名内部类的样板代码让核心逻辑更突出。函数式思维将“行为”作为参数传递为集合流式处理打下基础。框架基石Spring 回调、MyBatis 函数式接口、Java 并发包都大量使用 Lambda。面试高频函数式接口、方法引用、Lambda 底层原理是必考题。一、为什么需要 Lambda告别匿名内部类 1. 传统写法 vs Lambda 写法// ❌ 传统匿名内部类啰嗦重点不突出newThread(newRunnable(){Overridepublicvoidrun(){System.out.println(线程执行了);}}).start();// ✅ Lambda只关心“做什么”不关心“类结构”newThread(()-{System.out.println(线程执行了);}).start();2. 本质理解┌─────────────────────────────────────┐ │ Lambda 本质 │ │ 是“匿名函数” “函数式接口实例” │ │ │ │ 前提接口必须只有一个抽象方法 │ │ 好处编译器自动推断类型代码极简 │ └─────────────────────────────────────┘一句话理解“Lambda 就是简化版的匿名内部类只保留核心逻辑代码”二、语法规范与函数式接口 1. Lambda 表达式语法// 标准格式(参数列表) - { 方法体 }(a,b)-{returnab;};// ✅ 简化规则编译器自动推断// 1. 参数类型可省略// 2. 单个参数可省略括号// 3. 单行代码可省略大括号和 return(a,b)-ab;// 最简写法2. 函数式接口FunctionalInterface// ✅ 规范只能有一个抽象方法FunctionalInterfacepublicinterfaceMyCalculator{intcalculate(inta,intb);// 抽象方法// 可以有默认方法/静态方法不影响函数式特性defaultvoidprint(){System.out.println(计算);}}// ✅ 使用 Lambda 实现MyCalculatoradd(a,b)-ab;System.out.println(add.calculate(3,5));// 输出 83. JDK 内置四大核心函数式接口⭐ 必背接口泛型抽象方法作用示例ConsumerTvoid accept(T t)消费型有参无返list.forEach(System.out::println)SupplierTT get()供给型无参有返() - new User()FunctionT,RR apply(T t)函数型有参有返s - s.length()PredicateTboolean test(T t)断言型判断s - s.isEmpty()三、方法引用Lambda 的极致简化 :: ⚡1. 什么是方法引用 场景Lambda 体内部只是调用了一个已有方法 ✅ 解决直接用方法名引用更简洁2. 四种引用方式// 1️⃣ 静态方法引用类名::方法名FunctionString,IntegerparserInteger::parseInt;// 等价于 s - Integer.parseInt(s)// 2️⃣ 实例方法引用对象::方法名Stringstrhello;SupplierIntegerlenProviderstr::length;// 等价于 () - str.length()// 3️⃣ 类实例方法引用类名::方法名特殊第一个参数作为调用者FunctionString,IntegerlenFuncString::length;// 等价于 s - s.length()// 4️⃣ 构造器引用类名::newSupplierUseruserSupplierUser::new;// 等价于 () - new User()记忆口诀“Lambda 体里只调用方法引用来简化静态类名实例对象构造器用 new 替代”四、 今日实战任务Lambda 重构练习任务 1重写线程创建代码/** * 要求 * 1. 用 Lambda 表达式重写 Runnable 实现 * 2. 用方法引用重写如果适用 * 3. 对比代码行数差异 * * 提示 * new Thread(() - System.out.println(Hello)); */任务 2集合排序重构/** * 业务场景用户列表按年龄排序 * * 要求 * 1. 创建 User 类name, age * 2. 传统写法new ComparatorUser() { ... } * 3. Lambda 写法(u1, u2) - u1.getAge() - u2.getAge() * 4. 方法引用Comparator.comparingInt(User::getAge) * * 挑战 * - 尝试按姓名长度排序 * - 尝试链式排序先按年龄年龄相同按姓名 */ListUserusersArrays.asList(newUser(Alice,20),newUser(Bob,18));// TODO: 用 Lambda 排序任务 3自定义函数式接口/** * 要求 * 1. 定义 FunctionalInterface Operation * 2. 抽象方法int compute(int a, int b) * 3. 创建 Lambda 实现加法、减法、乘法 * 4. 编写方法 executeOperation(int a, int b, Operation op) * * 提示 * 模拟策略模式用 Lambda 替代策略类 */任务 4遍历与消费Consumer/** * 要求 * 1. 创建 ListString 包含 5 个名字 * 2. 用 foreach 循环遍历打印 * 3. 用 List.forEach() Lambda 遍历打印 * 4. 用方法引用 System.out::println 遍历打印 * * 观察 * 代码越来越简洁但可读性是否下降思考平衡点 */ 第 25 天 · 核心总结极简背诵版Lambda 本质简化版匿名内部类 前提函数式接口只有一个抽象方法语法简化规则(inta,intb)-{returnab;}// 标准(a,b)-ab// 最简四大核心接口ConsumerTvoid accept(T) → 消费 SupplierTT get() → 供给 FunctionT,RR apply(T) → 转换 PredicateTboolean test(T)→ 判断方法引用静态方法Class::method 实例方法object::method 构造器Class::new明天预告Stream 流式编程—— 集合处理的革命Stream 创建Collection.stream, Stream.of中间操作filter, map, sorted, distinct终止操作collect, forEach, count实战用户数据筛选、转换、统计准备好了吗明天我们让集合操作“流”起来 ✨