Java8 新特性之 Lambda 表达式
前言Java8 的发布带来了诸多革命性的新特性其中 Lambda 表达式是函数式编程思想在 Java 中的落地实现极大简化了代码编写方式。本文将从 Lambda 表达式的基础语法、使用场景、省略规则等维度全方位解析这一核心特性。Java8 新特性如下Lambda 表达式函数式接口Stream API新的日期时间 API接口默认方法 静态方法Optional 类方法引用一、Lambda 表达式初识在传统面向对象编程中我们常常需要通过匿名内部类实现接口例如对数组进行排序javaimport java.util.Arrays; import java.util.Comparator; public class Test1 { public static void main(String[] args) { Integer[] arr {5,7,1,8,9,3}; // 传统匿名内部类写法 Arrays.sort(arr, new ComparatorInteger() { Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); // Lambda表达式简化写法 Arrays.sort(arr, (Integer o1, Integer o2) - { return o1 - o2; } ); System.out.println(Arrays.toString(arr)); } }从代码中可以明显看出Lambda 表达式摆脱了面向对象语法的束缚直接聚焦 “做什么” 而非 “谁去做”。二、函数式编程思想2.1 核心对比面向对象编程先找对象让对象完成具体操作语法上必须遵循类、对象的约束。函数式编程忽略复杂的面向对象语法核心关注 “执行什么逻辑”Lambda 表达式是函数式编程在 Java 中的核心体现。三、Lambda 表达式核心语法3.1 基础语法格式() - { // 方法体 }()对应接口抽象方法的形参列表-Lambda 操作符用于分隔参数和方法体{}对应接口抽象方法的方法体3.2 使用场景Lambda 表达式仅能简化函数式接口的匿名内部类写法。函数式接口定义有且仅有一个抽象方法的接口可通过FunctionalInterface注解标识注解非必须但推荐使用编译器会校验接口是否符合函数式接口规范。错误示例非函数式接口javapublic class Test2 { public static void main(String[] args) { // 编译报错Animal不是函数式接口 testSay(() - { System.out.println(旺旺旺......); }); } public static void testSay(Animal animal){ animal.say(); } } FunctionalInterface // 注解校验失败因为存在两个抽象方法 abstract class Animal{ public abstract void say(); public abstract void eat(); }四、Lambda 表达式省略规则Lambda 表达式支持语法省略核心口诀左右遇一括号省左侧推断类型省能省则省。4.1 省略规则详情参数类型可省略编译器可通过上下文推断类型若仅有一个参数参数类型省略的同时()也可省略若方法体仅有一行代码{}、分号、return需同时省略三者缺一不可。简记口诀左右遇一括号省左侧推断类型省能省则省略4.2 完整示例对比javaimport java.util.Arrays; import java.util.Comparator; public class Test3 { public static void main(String[] args) { Integer[] arr {5,7,1,8,9,3}; // 1. 传统匿名内部类 Arrays.sort(arr, new ComparatorInteger() { Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); // 2. Lambda完整格式 Arrays.sort(arr, (Integer o1, Integer o2)-{ return o1 - o2; } ); // 3. Lambda省略格式最终简化版 Arrays.sort(arr, (o1, o2) - o1 - o2); System.out.println(Arrays.toString(arr)); } }五、实战练习练习 1遍历集合List/Set/Mapjavaimport java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public class LambdaPractice1 { public static void main(String[] args) { // 遍历List ListInteger list new ArrayList(); list.add(5); list.add(1); list.add(3); list.add(9); list.add(2); list.forEach(num - System.out.println(num)); // 遍历Set SetInteger set new HashSet(); set.add(5); set.add(1); set.add(3); set.add(9); set.add(2); set.forEach(num - System.out.println(num)); // 遍历Map MapInteger, String map new HashMap(); map.put(1, tom); map.put(2, jerry); map.put(3, lucy); map.put(4, make); map.forEach((k, v) - System.out.println(key: k , value: v)); } }练习 2按字符串长度排序数组javaimport java.util.Arrays; public class LambdaPractice2 { public static void main(String[] args) { String[] arr {a, aaaa, aa, aaa}; // Lambda简化写法 Arrays.sort(arr, (s1, s2) - s1.length() - s2.length()); System.out.println(Arrays.toString(arr)); // 输出[a, aa, aaa, aaaa] } }总结Lambda 表达式是 Java8 函数式编程的核心其核心价值在于简化函数式接口的匿名内部类写法让代码更简洁、聚焦业务逻辑。掌握其语法格式、使用场景仅函数式接口和省略规则是灵活运用 Lambda 的关键。后续我们还会结合 Stream API 等特性进一步讲解 Lambda 的实战场景。