标签:Java8, Stream API, 函数式编程, 集合操作
一、前言
随着 Java 8 的推出,Stream API 成为了处理集合数据的一种高效方式。List.stream()
是 Java Stream API 的入口方法之一,它允许开发者将集合转换为流,并通过链式调用实现诸如过滤、映射、排序等复杂逻辑。本文将系统地介绍 list.stream()
的使用方法,并提供大量代码示例帮助理解。
二、什么是 Stream?
Stream
并不是一种新的数据结构,而是对集合进行函数式操作的抽象工具。它支持一系列中间操作(如 filter、map)和终端操作(如 collect、forEach),最终返回一个结果。
特点:
- 链式调用:多个操作可以串联成一行清晰的语句。
- 惰性求值:中间操作不会立即执行,直到遇到终端操作。
- 不可复用:一个 Stream 只能被消费一次。
- 并行处理能力:可通过
parallelStream()
实现多线程处理。
三、List.stream() 的基本使用流程
List<T> result = list.stream()
.filter(...)
.map(...)
.sorted(...)
.collect(Collectors.toList());
整个过程包括:
- 创建流;
- 多个中间操作;
- 一个终端操作(如收集到列表、计数等)。
四、常用操作详解与示例
(1) 过滤(Filter)
筛选满足条件的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
// 输出: [2, 4]
(2) 映射(Map)
将每个元素映射为另一种形式或类型。
List<String> words = Arrays.asList("apple", "banana", "cherry");
List<Integer> wordLengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
// 输出: [5, 6, 6]
(3) 排序(Sorted)
默认按自然顺序排序,也可自定义比较器。
List<String> sortedList = words.stream()
.sorted()
.collect(Collectors.toList());
// 输出: ["apple", "banana", "cherry"]
// 按长度倒序排序
List<String> customSorted = words.stream()
.sorted((a, b) -> b.length() - a.length())
.collect(Collectors.toList());
// 输出: ["banana", "cherry", "apple"]
(4) 去重(Distinct)
去除重复元素。
List<Integer> duplicates = Arrays.asList(1, 2, 2, 3, 3, 3);
List<Integer> unique = duplicates.stream()
.distinct()
.collect(Collectors.toList());
// 输出: [1, 2, 3]
(5) 匹配(Match)
判断是否满足某些条件。
boolean hasEven = numbers.stream()
.anyMatch(n -> n % 2 == 0); // 是否存在偶数
// 输出: true
boolean allEven = numbers.stream()
.allMatch(n -> n % 2 == 0); // 是否全为偶数
// 输出: false
(6) 聚合操作(Reduce)
合并流中的元素,常用于求和、最大值、最小值等。
Optional<Integer> sum = numbers.stream()
.reduce(Integer::sum);
// 输出: Optional[15]
Optional<Integer> max = numbers.stream()
.reduce(Integer::max);
// 输出: Optional[5]
(7) 收集结果(Collect)
将流的结果收集到指定的数据结构中。
Set<Integer> numberSet = numbers.stream()
.collect(Collectors.toSet());
Map<Integer, String> map = numbers.stream()
.collect(Collectors.toMap(
n -> n,
n -> "Num" + n
));
五、并行流(Parallel Stream)
对于大数据量处理,可使用 parallelStream()
提高性能。
List<Integer> largeList = ...; // 假设有大量数据
long count = largeList.parallelStream()
.filter(n -> n > 100)
.count();
⚠️ 注意事项:并行流虽然提升了效率,但也可能带来线程安全问题,需谨慎使用。
六、注意事项与最佳实践
项目 | 说明 |
---|---|
不可复用 | 一个 Stream 只能使用一次,重复使用会抛出异常 |
惰性求值 | 中间操作不会立即执行,直到触发终端操作 |
避免副作用 | 不要在 map 或 filter 中修改外部变量 |
合理使用并行流 | 小数据量时普通 stream 更高效,大集合才考虑 parallelStream |
七、总结
List.stream()
是 Java 8 引入的重要特性之一,极大地简化了集合的操作逻辑,使得代码更加简洁、易读、功能强大。通过本文的学习,你应该掌握了以下技能:
- 如何创建和使用 Stream;
- 各种常见中间操作(filter、map、sorted、distinct);
- 终端操作(collect、forEach、reduce、match);
- 并行流的基本使用;
- 使用过程中需要注意的问题。
掌握好 Stream API,是迈向现代 Java 开发的重要一步!
八、参考资料
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、评论,也可以关注我的 CSDN 博客获取更多 Java 技术干货!