当前位置: 首页 > news >正文

Java 中 List.stream() 的全面使用指南(含完整示例)

标签: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. 创建流;
  2. 多个中间操作;
  3. 一个终端操作(如收集到列表、计数等)。

四、常用操作详解与示例

(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); // 是否存在偶数
// 输出: trueboolean 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 开发的重要一步!


八、参考资料

  • Oracle 官方文档 - Stream

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、评论,也可以关注我的 CSDN 博客获取更多 Java 技术干货!

http://www.lqws.cn/news/598195.html

相关文章:

  • jQuery 安装使用教程
  • OpenCV CUDA模块设备层-----二值化阈值操作函数thresh_binary_func()
  • android车载开发之HVAC
  • Conda 虚拟环境克隆与 PyCharm 配置教程
  • C# 程序:查看 PageUp 热键消息映射表
  • 系统性能优化-9 HTTP1.1
  • 柱塞泵体结构化网格划分
  • 408第三季part1 - 操作系统 - 基本分页II
  • 【仿muduo库实现并发服务器】Channel模块
  • 安卓内核定制开发笔记(三)系统调用Hook
  • 打造可观测的 iOS CICD 流程:调试、追踪与质量保障全记录
  • 计算机网络(二)应用层HTTP协议
  • 数据结构day6——内核链表
  • 修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解
  • ESP32-S3开发板深度评测:AI语音识别与图像处理全面解析
  • [2025CVPR]DE-GANs:一种高效的生成对抗网络
  • Android屏幕共享+WebSocket实现传输截图
  • 【代码审计】安全审核常见漏洞修复策略
  • Vue 3 中的 `h` 函数详解
  • android RecyclerView隐藏整个Item后,该Item还占位留白问题
  • 【Java编程动手学】Java的“三体”世界:JVM、JRE、JDK的共生之道
  • 从 0 到 1 构建可视化限流演示:React + Framer Motion 实现 Token Bucket 动画
  • 折线图多数据处理
  • 基于Halcon平台的常规OCR与深度OCR性能对比分析
  • 前端技术栈 —— HTML、CSS和JavaScirpt执行环境
  • 热血三国野地名将列表
  • 如何hack边缘的kubelet修改Cgroup数值
  • 事务隔离级别深度解析:机制、语法与实战指
  • Jenkins生态与拓展:构建现代化DevOps工具链的终极指南
  • android apk签名