news 2026/2/25 18:36:54

272. Java Stream API - 使用数字专用流,避免装箱开销

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
272. Java Stream API - 使用数字专用流,避免装箱开销

文章目录

  • 272. Java Stream API - 使用数字专用流,避免装箱开销
      • 🚫 问题:普通 `Stream` 会引发装箱性能问题
      • ✅ 解决方案:使用数字专用流
      • 📊 IntStream 示例:终端操作更丰富
      • 🧮 `summaryStatistics()` 示例
    • ✅ 最佳实践:使用 Stream 的注意事项
      • ⚠️ 一、不要复用 Stream 对象
      • ⚠️ 二、不要把 `Stream` 存成字段或变量长期保留
      • ⚠️ 三、避免对流外部变量产生副作用
    • ✅ 总结小贴士

272. Java Stream API - 使用数字专用流,避免装箱开销

我们知道,Java中的Stream<T>处理的是对象,但如果你处理的是大量的数字(intlongdouble),就需要注意“装箱与拆箱(boxing/unboxing)”的问题。

🚫 问题:普通Stream会引发装箱性能问题

Stream<Integer>numbers=List.of(1,2,3,4).stream();// 每个 int 都是 Integer 对象intsum=numbers.reduce(0,Integer::sum);// 多次装箱与拆箱,性能不佳

✅ 解决方案:使用数字专用流

Java提供了三个专用数字流接口来避免装箱开销:

  • IntStream:处理int值流
  • LongStream:处理long值流
  • DoubleStream:处理double值流

它们使用的是原始类型(primitive types,不会自动装箱,性能更高。


📊 IntStream 示例:终端操作更丰富

importjava.util.stream.IntStream;publicclassStatExample{publicstaticvoidmain(String[]args){IntStreamstream=IntStream.of(10,20,30,40,50);intsum=stream.sum();// 🚀 无装箱,高效计算System.out.println("Sum: "+sum);// 输出:Sum: 150}}

数字流接口提供了一些Stream<T>没有的终端操作:

方法名描述
sum()计算总和
min(),max()查找最小值和最大值
average()计算平均值(返回OptionalDouble
summaryStatistics()返回一个统计对象:总数、最小、最大、平均、总和

🧮summaryStatistics()示例

IntSummaryStatisticsstats=IntStream.of(10,20,30,40).summaryStatistics();System.out.println("Count: "+stats.getCount());System.out.println("Sum: "+stats.getSum());System.out.println("Average: "+stats.getAverage());System.out.println("Min: "+stats.getMin());System.out.println("Max: "+stats.getMax());

输出:

Count:4Sum:100Average:25.0Min:10Max:40

🎯 只需遍历一次数据流,五个指标一次到位!


✅ 最佳实践:使用 Stream 的注意事项

使用 Stream 时,以下行为要避免或注意,以确保安全性、可读性和性能。


⚠️ 一、不要复用 Stream 对象

错误示例:

Stream<String>stream=List.of("A","B","C").stream();varupper=stream.map(String::toUpperCase);varlist=stream.toList();// ❌ 第二次使用同一个 stream,会抛异常!

正确示例:

List<String>data=List.of("A","B","C");varupper=data.stream().map(String::toUpperCase).toList();varlower=data.stream().map(String::toLowerCase).toList();// ✅ 每次新建 stream

📌流只能使用一次,操作完就“关闭”了。


⚠️ 二、不要把Stream存成字段或变量长期保留

为什么?
Stream 是连接到数据源的“流水线”,并不存储数据。如果保存到字段中,容易:

  • 被重复使用引发错误
  • 引入副作用
  • 增加代码难以追踪的数据流动问题

✅ 最佳实践:流应就地创建、就地消费!

// ✅ 好做法List<Integer>result=List.of(1,2,3).stream().map(i->i*2).filter(i->i>3).toList();

⚠️ 三、避免对流外部变量产生副作用

int[]total={0};List.of(1,2,3).stream().forEach(i->total[0]+=i);// ❌ 修改外部变量,副作用!System.out.println(total[0]);

这段代码虽然能运行,但它:

  • 破坏了函数式编程的纯粹性
  • 在并行流中(parallel stream)可能导致竞态条件(race condition)

✅ 推荐写法:

intsum=List.of(1,2,3).stream().mapToInt(Integer::intValue).sum();// ✅ 无副作用

✅ 总结小贴士

规则原因
✔ 使用 IntStream、LongStream、DoubleStream避免装箱,提高数字处理性能
✔ 每次新建 stream,不要重复使用同一个Stream 一次性消费,不能重复使用
✔ 不要把 stream 存成字段或变量长期保留增加代码复杂性,并可能导致使用错误
✔ 避免修改外部变量(无副作用)保持函数式风格,保证线程安全
✔ 中间操作返回新 stream,不会立刻执行执行在终端操作触发时才发生
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/19 6:26:25

紧急规避生产事故:多模态Agent未隔离网络的3个致命风险(必读)

第一章&#xff1a;多模态 Agent 的 Docker 网络隔离概述在构建多模态 Agent 系统时&#xff0c;Docker 容器化技术为不同模态&#xff08;如文本、图像、语音&#xff09;的处理模块提供了轻量级、可移植的运行环境。然而&#xff0c;多个 Agent 模块之间既需要独立运行以保障…

作者头像 李华
网站建设 2026/2/25 4:25:45

Docker容器间Agent服务互相影响?资深运维总结的5级隔离模型曝光

第一章&#xff1a;Docker容器间Agent服务互相影响&#xff1f;资深运维总结的5级隔离模型曝光在微服务架构日益复杂的今天&#xff0c;多个Docker容器中运行的Agent服务&#xff08;如监控、日志采集、安全探针等&#xff09;常因资源争抢或网络冲突导致异常行为。资深运维团队…

作者头像 李华
网站建设 2026/2/18 3:30:42

揭秘Docker Buildx构建日志:5个你必须关注的关键调试信息

第一章&#xff1a;Docker Buildx构建日志的核心价值Docker Buildx 是 Docker 官方提供的 CLI 插件&#xff0c;扩展了原生 docker build 命令的能力&#xff0c;支持跨平台构建、并行输出和高级镜像构建功能。在多架构支持日益重要的今天&#xff0c;构建日志不再仅仅是输出信…

作者头像 李华
网站建设 2026/2/22 19:23:45

为什么顶级AI团队都在用Docker网络隔离保护多模态Agent?真相揭晓

第一章&#xff1a;多模态 Agent 的 Docker 网络隔离在构建多模态 Agent 系统时&#xff0c;Docker 容器化技术为不同功能模块&#xff08;如语音识别、图像处理、自然语言理解&#xff09;提供了轻量级部署方案。然而&#xff0c;多个 Agent 间若共用默认网络环境&#xff0c;…

作者头像 李华
网站建设 2026/2/24 16:02:03

【C语言入门】彻底搞懂一维数组

在编程的世界里&#xff0c;我们经常需要处理大量同类型的数据。比如统计全班50个同学的成绩&#xff0c;或者存储100个随机生成的数字。如果没有数组&#xff0c;你可能需要定义50个变量&#xff1a; score1, score2, ..., score50 。这不仅写起来累死人&#xff0c;计算平均分…

作者头像 李华
网站建设 2026/2/18 20:35:10

Docker-LangGraph Agent多实例部署方案(生产环境可用架构曝光)

第一章&#xff1a;Docker-LangGraph Agent多实例部署方案概述 在构建高可用、可扩展的智能代理系统时&#xff0c;Docker-LangGraph Agent 多实例部署方案提供了一种现代化的架构模式。该方案利用容器化技术将 LangGraph Agent 封装为独立运行的服务单元&#xff0c;并通过 Do…

作者头像 李华