流式编程的中间操作
流式编程的中间操作
Java Stream 的中间操作是流式编程的核心,它们负责对数据流进行处理和转换,并且支持链式调用。下面我会逐个拆解常用的中间操作,包括用法、原理和实战案例,帮你彻底掌握。
一、过滤:filter(Predicate<T>)
作用
保留流中满足条件的元素(Predicate
是函数式接口,返回 boolean
)。
示例
List<String> list = Arrays.asList("apple", "banana", "cherry", "date");// 保留长度 > 5 的字符串
Stream<String> filtered = list.stream().filter(s -> s.length() > 5); // 条件:长度大于5// 结果流包含:["banana", "cherry"]
关键细节
- 过滤是“筛选”而非“修改”,不改变元素本身,只决定是否保留。
- 适合场景:从集合中筛选符合业务条件的元素(如状态为“启用”的用户)。
二、映射:map(Function<T, R>)
与 flatMap(Function<T, Stream<R>>)
1. map(Function<T, R>)
作用:将流中的每个元素通过 Function
转换为另一种类型(一对一映射)。
示例:
List<String> words = Arrays.asList("a", "b", "c");// 将字符串转换为其长度(String -> Integer)
Stream<Integer> lengths = words.stream().map(s -> s.length()); // 或方法引用:String::length// 结果流:[1, 1, 1]
场景:提取对象的某个字段(如 List<User>
转 List<Long>
用户ID)。
2. flatMap(Function<T, Stream<R>>)
作用:将流中的每个元素转换为一个新的流,再将所有新流“扁平化”为一个流(一对多映射+合并)。
示例:
List<List<String>> nestedList = Arrays.asList(Arrays.asList("a", "b"),Arrays.asList("c", "d")
);// 扁平化嵌套列表(List<List<String>> -> Stream<String>)
Stream<String> flatStream = nestedList.stream().flatMap(innerList -> innerList.stream()); /