如果你还在使用繁琐的for循环和临时集合来处理数据,是时候了解Java 8引入的Stream API了。它让数据处理变得声明式、可组合,并且更加优雅。
什么是Stream?
Stream不是数据结构,而是对数据源(集合、数组等)的元素序列进行函数式操作的包装器。它支持顺序和并行聚合操作,让你能够以更高级的方式表达复杂的数据处理查询。
传统方式 vs. Stream API
假设我们有一个字符串列表,需要过滤出非空字符串并转换为大写。
-
传统命令式写法:
List<String> names = Arrays.asList("java", "", "stream", "api"); List<String> result = new ArrayList<>(); for (String name : names) {if (!name.isEmpty()) {result.add(name.toUpperCase());} } -
Stream API声明式写法:
List<String> result = names.stream().filter(s -> !s.isEmpty()).map(String::toUpperCase).collect(Collectors.toList());
Stream版本不仅代码更简洁,而且意图清晰:过滤→映射→收集,如同阅读一个数据处理流水线。
核心操作一览
Stream操作分为中间操作(返回Stream)和终端操作(返回结果):
filter(Predicate):根据条件过滤元素map(Function):将元素转换为另一种形式sorted():对流元素排序collect(Collectors):将流转换为集合或其他形式forEach(Consumer):对每个元素执行操作
并行处理的威力
Stream最大的优势之一是轻松实现并行处理:
List<String> result = names.parallelStream() // 只需改为parallelStream.filter(s -> !s.isEmpty()).map(String::toUpperCase).collect(Collectors.toList());
总结
Stream API代表了Java向函数式编程的迈进,它让数据处理代码:
- 更声明式(关注"做什么"而非"怎么做")
- 更易读和维护
- 更容易实现并行化