JavaStream API的语法和基本操作

发布时间 - 2026-01-11 00:00:00    点击率:
Java Stream 是一次性管道,执行终端操作后即关闭,重复调用会抛 IllegalStateException;filter 保留元素、map 一对一转换、flatMap 展平嵌套流;需过滤 null 避免 NPE;并行流非万能,受限于数据量、操作状态及 IO 类型。

Stream 是一次性消费的,不能重复调用 collect()forEach()

Java 的 Stream 不是数据容器,而是一次性管道。一旦执行了终端操作(如 collect()forEach()count()),流就关闭了。再调用会抛出 java.lang.IllegalStateException: stream has already been operated upon or closed

  • 错误写法:
    List list = Arrays.asList("a", "b");
    Stream s = list.stream();
    s.collect(Collectors.toList());
    s.forEach(System.out::println); // ❌ 报错
  • 正确做法:每次需要新流就重新创建 —— list.stream().map(...).collect(...),或把中间操作链写完整再执行终端操作
  • 调试时别在中间插 forEach() 打断流;要用 peek()stream.peek(System.out::println).filter(...)

filter()map()flatMap() 的关键区别

这三个是最常混用的中间操作,核心差异在「返回值类型」和「是否扁平化」:

  • filter(Predicate):输入 T,输出仍是 T,但只保留满足条件的元素(数量 ≤ 原始)
  • map(Function):输入 T,输出 R,一对一转换(数量不变)
  • flatMap(Function>):输入 T,输出 Stream,然后自动“展平”一层(适合处理嵌套集合、Optional、字符串转字符流等)

例如把 List> 拉平成 List,必须用 flatMap

listOfLists.stream()
    .flatMap(innerList -> innerList.stream())
    .collect(Collectors.toList());

空集合、null 元素与 Optional 的配合要点

Stream 本身不拒绝 null 元素,但多数终端操作(如 collect())在遇到 null 时可能抛 NullPointerException,尤其在使用 Collectors.toMap() 时键或值为 null 会直接失败。

  • 安全过滤 null:stream.filter(Objects::nonNull)
  • 避免 toMap() 因 key 为 null 失败:
    stream.filter(Objects::nonNull)
        .collect(Collectors.toMap(
            item -> item.getId(), 
            item -> item.getName(),
            (a, b) -> a // 冲突解决,防止 key 重复
        ));
  • 对可能为空的计算结果,优先用 Optional 包裹再进流:Optional.ofNullable(obj).map(...).stream(),比在流里判空更清晰

并行流(parallelStream())不是性能银弹

parallelStream() 底层用的是 ForkJoinPool.commonPool(),看似开箱即用,但实际受多个因素制约:

  • 数据量小(比如 计算收益
  • 操作有状态(如修改外部变量、使用非线程安全的 ArrayList 收集)会导致结果不可预测,必须改用线程安全容器或 collect() 的三参数重载
  • IO 密集型操作(如读文件、发 HTTP 请求)不适合并行流,应考虑 CompletableFuture 等异步模型
  • 想控制线程池?别用 commonPool(),显式构造 ForkJoinPool 并用 submit() 提交任务更可控

真正需要并行时,优先验证单线程瓶颈、确认操作无状态、再压测对比。


# java  # stream  # 区别  # red 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  详解vue.js组件化开发实践  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  JS去除重复并统计数量的实现方法  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  网站制作价目表怎么做,珍爱网婚介费用多少?  网易LOFTER官网链接 老福特网页版登录地址  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  iOS中将个别页面强制横屏其他页面竖屏  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何在Tomcat中配置并部署网站项目?  如何快速搭建安全的FTP站点?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  原生JS获取元素集合的子元素宽度实例  敲碗10年!Mac系列传将迎来「触控与联网」双革新  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  如何在Windows 2008云服务器安全搭建网站?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  文字头像制作网站推荐软件,醒图能自动配文字吗?  如何在阿里云虚拟主机上快速搭建个人网站?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  大型企业网站制作流程,做网站需要注册公司吗?  如何在VPS电脑上快速搭建网站?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  香港服务器租用费用高吗?如何避免常见误区?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何将凡科建站内容保存为本地文件?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)