Lambda表达式基础
Lambda表达式是Java 8引入的一种简洁的匿名函数表示方式,用于简化函数式接口的实现。其基本语法为:
java
(parameters) -> expression
或
java
(parameters) -> { statements; }
常见用法示例:
java
// 无参数
Runnable r = () -> System.out.println("Hello");
// 单参数
Consumer<String> c = s -> System.out.println(s);
// 多参数
Comparator<Integer> comp = (a, b) -> a.compareTo(b);
前端视角:Lambda 表达式(对应 JS 箭头函数)
作用:简化 "函数式接口"(只有一个抽象方法的接口)的实现,替代匿名内部类。
-
前端对比:
--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdownyaml
// JS 箭头函数 const add = (a, b) => a + b; -
Java 8 实现:
--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdownyaml
// 函数式接口(JDK 自带的 Function 接口) import java.util.function.BiFunction; public class LambdaDemo { public static void main(String[] args) { // Lambda 表达式(对应 JS 箭头函数) BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b; System.out.println(add.apply(10, 20)); // 输出 30 } } -
核心规则:参数列表 → 箭头 → 方法体(单行可省略 {},多行必须加)。
Stream API基础
Stream是Java 8提供的对集合数据进行函数式操作的API,主要特点包括:
- 不存储数据(仅处理数据源)
- 不修改源数据
- 延迟执行(终端操作触发)
创建Stream
java
List<String> list = Arrays.asList("a", "b", "c");
// 从集合创建
Stream<String> stream1 = list.stream();
// 静态方法生成
Stream<String> stream2 = Stream.of("a", "b", "c");
常用中间操作
java
.filter(s -> s.startsWith("a")) // 过滤
.map(String::toUpperCase) // 转换
.sorted() // 排序
.distinct() // 去重
常用终端操作
java
.forEach(System.out::println) // 遍历
.collect(Collectors.toList()) // 收集为集合
.count() // 计数
.reduce((a,b) -> a+b) // 归约
前端视角:Stream 流(对应 JS 数组方法)
Stream 是 Java 8 处理集合的 "神器",和 JS 的 map/filter/reduce 逻辑几乎一致,前端开发者极易上手。
-
前端对比:
// JS 数组处理:过滤偶数 → 乘2 → 求和 const arr = [1,2,3,4,5]; const result = arr.filter(x => x%2===0).map(x => x*2).reduce((a,b) => a+b, 0); console.log(result); // 输出 12 -
Java 8 Stream 实现:
import java.util.Arrays; import java.util.List; public class StreamDemo { public static void main(String[] args) { List<Integer> list = Arrays.asList(1,2,3,4,5); // Stream 流:过滤 → 映射 → 归约(求和) int result = list.stream() .filter(x -> x % 2 == 0) // 过滤偶数(对应 JS filter) .mapToInt(x -> x * 2) // 乘2(对应 JS map) .sum(); // 求和(对应 JS reduce 求和) System.out.println(result); // 输出 12 } } -
常用 Stream 方法:
-
中间操作:filter(过滤)、map(映射)、sorted(排序)、distinct(去重);
-
终止操作:forEach(遍历)、collect(收集结果,如转 List/Map)、sum/count(统计)、findFirst(找第一个)。
-
Lambda与Stream结合示例
统计字符串列表中长度大于3的元素数量:
java
long count = list.stream()
.filter(s -> s.length() > 3)
.count();
将数字列表中的偶数平方后收集为新列表:
java
List<Integer> squares = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.collect(Collectors.toList());
注意事项
- Lambda中使用的局部变量必须是final或等效final
- Stream操作是单向的,不可重复使用
- 并行流(parallelStream)需注意线程安全问题
- 避免在Lambda中修改外部状态
