Java Stream详解
Stream 是 Java 8 引入的流式数据处理工具,可以像流水线一样对集合数据进行高效操作(过滤、转换、统计等)。核心特点:
- 链式操作:支持多个操作串联
- 不修改原始数据:生成新结果
- 支持并行处理:自动利用多核性能
🛠️ 常用操作分两类
类型 | 特点 | 示例方法 |
---|---|---|
中间操作 | 返回新 Stream,可继续操作 | filter() , map() , sorted() |
终端操作 | 最终输出结果,流结束 | forEach() , collect() , count() |
🔧 核心操作详解(附代码示例)
✅ 1. 过滤数据 filter()
List<String> list = Arrays.asList("a1", "a2", "b1", "c1", "c2");
list.stream().filter(s -> s.startsWith("c")) // 过滤出以"c"开头.forEach(System.out::println); // 输出:c1, c2
➡️ 2. 数据转换 map()
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream().map(String::length) // 字符串转成长度数值.collect(Collectors.toList()); // [5, 3, 7]
🔀 3. 扁平化转换 flatMap()
List<List<Integer>> numbers = Arrays.asList(Arrays.asList(1, 2),Arrays.asList(3, 4)
);List<Integer> flattened = numbers.stream().flatMap(Collection::stream) // 把多个列表"拍平".collect(Collectors.toList()); // [1, 2, 3, 4]
📊 4. 去重 distinct()
List<Integer> nums = Arrays.asList(1, 2, 2, 3, 3, 3);
long count = nums.stream().distinct() // 去重.count(); // 统计数量 → 3
🔍 5. 条件匹配
List<Integer> nums = Arrays.asList(10, 20, 30);
boolean allEven = nums.stream().allMatch(n -> n % 2 == 0); // 是否全是偶数? → true
boolean hasNegative = nums.stream().anyMatch(n -> n < 0); // 是否有负数? → false
🔄 6. 聚合计算 reduce()
List<Integer> nums = Arrays.asList(2, 4, 6);
int sum = nums.stream().reduce(0, (a, b) -> a + b); // 累加求和 → 12
📦 7. 结果收集 collect()
List<String> words = Arrays.asList("apple", "banana", "cherry");
// 转成新集合
Set<String> set = words.stream().filter(s -> s.length() > 5).collect(Collectors.toSet()); // {"banana", "cherry"}// 转成Map
Map<String, Integer> map = words.stream().collect(Collectors.toMap(s -> s, // key: 元素本身String::length // value: 字符串长度)); // {"apple":5, "banana":6, "cherry":6}
🎯 8. 其他实用操作
// 获取数量
long count = stream.count(); // 跳过前N个
List<Integer> result = IntStream.range(1,10).skip(5) // 跳过前5个.boxed().collect(Collectors.toList()); // [6,7,8,9]// 限制数量
List<Integer> first3 = stream.limit(3).toList();
⚡ 并行流示例(提速技巧)
List<Integer> bigList = ... // 大数据集
long count = bigList.parallelStream() // 自动并行处理.filter(n -> n % 2 == 0).count();
❗ 重要注意事项
- 流只能消费一次 - 终端操作后流即失效
- 中间操作延迟执行 - 直到终端操作才实际计算
- 非结构化数据不适用 - 如需要索引访问的场合
Stream 让数据处理代码更简洁高效,尤其适合大数据量或复杂操作场景 🚀。掌握这些核心操作后,可覆盖90%日常需求!