做presentation的网站金融社区类网站建设
Java Stream 流详解
Stream 是 Java 8 引入的 API,用于高效处理集合数据(如 List、Set、Map 等)。它支持函数式编程风格,能实现复杂的查询、过滤、映射等操作,并支持并行处理以提升性能。
核心特点
- 非存储数据结构:不存储数据,仅通过计算管道传递数据。
- 不修改源数据:所有操作生成新流,不影响原始集合。
- 惰性求值:中间操作延迟执行,直到遇到终止操作才触发计算。
- 可消费性:流只能被遍历一次,终止操作后流即失效。
操作分类
| 类型 | 操作 | 示例 |
|---|---|---|
| 创建流 | 从集合/数组生成流 | list.stream(), Arrays.stream(array) |
| 中间操作 | 返回新流(延迟执行) | filter(), map(), sorted(), distinct() |
| 终止操作 | 触发计算并返回结果(非流类型) | collect(), forEach(), reduce(), count() |
常用操作详解
1. 创建流
// 从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream1 = list.stream();// 从数组创建
String[] array = {"a", "b", "c"};
Stream<String> stream2 = Arrays.stream(array);// 直接创建
Stream<String> stream3 = Stream.of("a", "b", "c");// 生成无限流(需限制大小)
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 1).limit(10); // 0,1,2,...,9
2. 中间操作(链式调用)
-
filter(Predicate<T>):过滤元素stream.filter(s -> s.startsWith("a")); // 保留以"a"开头的元素 -
map(Function<T,R>):元素转换stream.map(String::toUpperCase); // 转为大写 ["A","B","C"] -
flatMap(Function<T,Stream<R>>):扁平化嵌套流List<List<String>> nestedList = Arrays.asList(Arrays.asList("a", "b"),Arrays.asList("c", "d") ); nestedList.stream().flatMap(List::stream) // 合并为["a","b","c","d"].forEach(System.out::println); -
distinct():去重Stream.of(1, 2, 2, 3).distinct(); // [1, 2, 3] -
sorted():排序Stream.of(3, 1, 2).sorted(); // [1, 2, 3] -
limit(long n):截取前 n 个元素Stream.iterate(0, i -> i + 1).limit(3); // [0, 1, 2]
3. 终止操作
-
collect(Collector):转换为集合List<String> list = stream.collect(Collectors.toList()); // 转List Set<String> set = stream.collect(Collectors.toSet()); // 转Set -
forEach(Consumer<T>):遍历元素stream.forEach(System.out::println); // 打印每个元素 -
reduce():聚合计算Optional<Integer> sum = Stream.of(1, 2, 3).reduce((a, b) -> a + b); // 6 -
count():统计元素数量long count = stream.filter(s -> !s.isEmpty()).count(); -
匹配检查
boolean anyMatch = stream.anyMatch(s -> s.contains("a")); // 任一元素匹配 boolean allMatch = stream.allMatch(s -> s.length() > 0); // 所有元素匹配
并行流
通过多线程加速处理大数据集:
// 创建并行流
List<String> result = list.parallelStream().filter(s -> s.length() > 2).collect(Collectors.toList());
注意:并行流需确保操作是线程安全的(如避免修改共享状态)。
实战示例
// 示例:从用户列表中筛选年龄≥18的用户,按姓名排序,提取前10个
List<User> users = ...; // 数据源List<String> result = users.stream().filter(user -> user.getAge() >= 18) // 过滤.sorted(Comparator.comparing(User::getName)) // 排序.limit(10) // 截取.map(User::getName) // 提取姓名.collect(Collectors.toList()); // 转为List
注意事项
- 流不可复用:终止操作后流即关闭,再次使用会抛出
IllegalStateException。 - 避免副作用:操作中不要修改外部变量(使用无状态函数)。
- 性能考量:小数据集用顺序流,大数据集用并行流(需测试验证)。
Stream API 大幅简化了集合操作代码,结合 Lambda 表达式,使 Java 处理数据更简洁高效。
