news 2026/4/23 14:58:36

JAVA集合与流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JAVA集合与流

Java 8 Stream API:集合操作的新范式

Java 8 引入了流(Stream)API,为集合提供了一种更加声明式、函数式的处理方式。流与集合的结合提供了更高效且易于理解的数据处理方式,极大地简化了集合的操作和转换。

1. 集合与流结合的概述

流(Stream)是对集合(Collection)和其他数据源(如数组、I/O通道、生成器等)元素的映射、过滤、聚合等操作的抽象。流使得集合的操作更为简洁高效,并且支持惰性计算和并行处理。

  • 集合:是数据存储的容器,保存了可变的数据集。
  • :是对集合数据的操作,流提供了通过声明式代码操作数据的方式,支持链式调用、惰性计算等特性。

流与集合结合的最大特点是可以通过流式操作对集合进行处理,而无需直接操作集合本身。

2. 创建流的方式

流的创建方式有多种,常见的创建流的方式包括:

  • 从集合创建流:通过集合类提供的stream()parallelStream()方法。
  • 从数组创建流:通过Arrays.stream()方法。
  • 通过 Stream 的静态方法生成:例如Stream.of()Stream.generate()等。

关键源码:集合创建流

  • stream()方法:提供一个串行流,逐一处理集合中的元素。
  • parallelStream()方法:提供一个并行流,能在多核处理器上并行执行操作。

3. 流的操作与链式调用

流支持链式调用的操作,分为两类:中间操作和终止操作。

  • 中间操作:如filter()map()distinct()等,返回一个新的流,不会立即执行。
  • 终止操作:如forEach()collect()reduce()等,会触发流的处理。

关键源码:流的中间操作

  • filter():过滤流中不符合条件的元素。
  • 惰性计算:中间操作不会立即执行,只有在终止操作执行时,所有中间操作才会开始执行。

关键源码:流的终止操作

  • count():计算流中的元素个数。
  • 触发执行:终止操作会触发中间操作的执行,从而返回结果。

4. 惰性求值与短路操作

流的中间操作通常是惰性求值的,这意味着中间操作不会立即执行,直到终止操作出现时才开始执行。

关键源码:Stream 的惰性求值

  • 惰性计算map()等中间操作会返回新的流,实际的计算只有在终止操作调用时才会执行。
  • 短路操作:例如findFirst()anyMatch()allMatch()等操作,它们会在满足某些条件时立即结束流的处理,从而避免多余的计算。

关键源码:findFirst()的短路

  • findFirst():找到流中的第一个元素,遇到结果后就停止进一步的计算。

5. 并行流与性能优化

流支持并行操作,允许将流的处理任务分解成多个子任务并在多个处理器上并行执行,从而提高性能。并行流的操作通过ForkJoinPool完成任务的分配和调度。

关键源码:并行流的实现

  • 并行流的启动:通过parallel()方法将流转换为并行流,内部使用线程池ForkJoinPool来并行执行。
  • 并行处理:并行流会将流的元素分配到多个线程中并行处理,适用于大规模数据处理场景,但在某些场景下,过度使用并行流会导致性能下降。

6. 集合与流结合的优化

集合和流的结合允许我们更加简洁高效地处理数据,但要注意优化流的使用以避免性能问题。以下是一些优化技巧:

  • 避免多次创建流:不要频繁地在集合上创建流,可以在一个流中执行多个操作。
  • 避免不必要的操作:在流式操作中,如果某些操作不会改变结果,应该避免执行它们。
  • 适当使用并行流:并行流适用于大规模数据,但对于小数据量或操作较简单的场景,串行流往往更高效。

关键源码:集合与流结合的优化示例

java复制

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .filter(n -> n % 2 == 0) .mapToInt(Integer::intValue) .sum();
  • 流的优化:使用流时,避免链式调用中无用的中间操作。通过mapToInt()等方法减少装箱和拆箱操作,提高性能。

7. 集合与流结合的实际应用

流和集合结合在实际开发中非常常见,尤其是在数据处理、转换、筛选等场景。以下是常见的应用场景:

  • 数据转换:将集合中的数据转换成另一种类型。
  • 数据筛选:根据某些条件筛选集合中的元素。
  • 聚合操作:例如计算总和、平均数、最大值等。

关键源码:数据筛选与转换示例

java复制

List<String> words = Arrays.asList("apple", "banana", "cherry"); List<String> result = words.stream() .filter(w -> w.length() > 5) .map(String::toUpperCase) .collect(Collectors.toList());
  • 数据筛选与转换:通过流可以轻松地对集合中的数据进行筛选和转换,符合函数式编程的风格。

8. 流与集合的结合与内存优化

流和集合结合可以有效地减少内存消耗,尤其是在处理大数据时,通过惰性计算和分段计算可以降低内存开销。

关键源码:流的内存优化

java复制

public Stream<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); return new StreamSupport<>(new StreamOpFlag[]{StreamOpFlag.NOT_SORTED, StreamOpFlag.DISTINCT}); }
  • 内存优化:流的中间操作不会马上执行,这样可以避免对整个集合进行完整的内存占用,减少了不必要的内存开销。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:19:14

企业客服场景实战:Live Avatar定制化数字人部署方案

企业客服场景实战&#xff1a;Live Avatar定制化数字人部署方案 1. 为什么企业客服需要定制化数字人 传统客服系统面临三大痛点&#xff1a;人力成本高、响应不及时、服务标准化难。当客户拨打热线或在网页发起咨询时&#xff0c;等待转接、重复描述问题、遇到情绪化客服等情…

作者头像 李华
网站建设 2026/4/23 12:11:57

ST7789V背光控制在STM32中的实践方法

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。全文严格遵循您的所有要求&#xff1a; ✅ 彻底去除AI痕迹 &#xff0c;语言自然、真实、有“人味”——像一位在嵌入式一线摸爬滚打多年的老工程师&#xff0c;在茶歇时跟你掏心窝子讲经验&#xf…

作者头像 李华
网站建设 2026/4/23 10:49:45

KeilC51和MDK共存时的编译器路径设置实战案例

以下是对您提供的博文内容进行深度润色与结构重构后的专业级技术文章。全文已彻底去除AI生成痕迹&#xff0c;语言更贴近一线嵌入式工程师的真实表达习惯&#xff1b;逻辑层层递进、由浅入深&#xff0c;兼具教学性与实战指导价值&#xff1b;所有技术细节均严格基于Keil官方文…

作者头像 李华
网站建设 2026/4/23 12:14:12

YOLOv9训练中断频发?环境依赖问题解决步骤详解

YOLOv9训练中断频发&#xff1f;环境依赖问题解决步骤详解 你是不是也遇到过这样的情况&#xff1a;刚跑起YOLOv9训练&#xff0c;不到十分钟就报错退出&#xff0c;终端里一串红色错误信息&#xff0c;最后卡在CUDA out of memory、ImportError: cannot import name xxx&…

作者头像 李华
网站建设 2026/4/23 12:16:19

Z-Image-Turbo_UI界面多平台兼容性测试结果分享

Z-Image-Turbo_UI界面多平台兼容性测试结果分享 1. 测试背景与目标 Z-Image-Turbo_UI 是一款基于 Gradio 框架构建的轻量级图像生成交互界面&#xff0c;用户只需在浏览器中访问 http://localhost:7860 即可快速启动图像生成流程。相比 ComfyUI 等复杂工作流平台&#xff0c;…

作者头像 李华
网站建设 2026/4/23 10:45:23

Llama3-8B显存爆了?22GB LoRA训练显存优化方案

Llama3-8B显存爆了&#xff1f;22GB LoRA训练显存优化方案 1. 为什么Llama3-8B训练会“爆显存” 你刚下载完 Meta-Llama-3-8B-Instruct&#xff0c;兴致勃勃打开 Llama-Factory&#xff0c;配置好数据集、LoRA 参数&#xff0c;点下 train.py —— 结果还没跑完第一个 batch&…

作者头像 李华