stream本身不保存状态,所有中间操作均无状态或内部有状态但不对外暴露;“状态记录”指轻量采集可观测信息而非改变流逻辑;peek()是安全可控的旁路记录入口,适合调试、统计、埋点,但需避免耗时操作,并行流中应使用atomicinteger或longadder替代共享可变变量,且计数器不可用于流逻辑分支。

Stream 本身不保存状态,所有中间操作都是无状态或有状态但不对外暴露的。所谓“状态记录”,实际是指在流处理过程中对元素、执行次数、异常特征等可观测信息进行轻量采集,而非改变流逻辑或维护可变上下文。
用 peek() 做安全、可控的旁路记录
peek() 是最常用的状态记录入口,它不修改元素、不中断流,只在终端操作触发时逐个执行 Consumer 动作。
- 适合打印调试信息、统计处理数量、采样日志、埋点指标(如 Micrometer Counter)
- 必须避免耗时操作(如网络请求、文件写入),否则拖慢整个流水线
- 并行流中禁止依赖共享可变变量(如普通 int 计数器),应改用 AtomicInteger 或 LongAdder
- 若仅需前 N 个样本日志,可在 peek 内加条件判断,防止刷屏
配合原子计数器做精确计数
想统计某个环节处理了多少元素,不能靠普通变量累加——尤其在 parallelStream 中会出错。
- 使用 AtomicInteger 或 LongAdder 初始化计数器
- 在 peek 中调用 incrementAndGet() 获取当前序号,再决定是否记录
- 例如:只对前 5 个元素打印完整字段,其余只记 ID 和时间戳
- 计数器值本身不可用于流逻辑分支(如 filter 条件),否则破坏惰性与纯函数性
按条件筛选关键状态打点
不是每个元素都值得记录,聚焦异常、边界、业务关键节点更高效。
- 在 peek 中嵌入 if 判断:比如 status == ERROR、responseTime > 1000、price
- 可组合多个条件,输出结构化日志(JSON 字符串或 SLF4J Marker)
- 避免在 peek 中 throw 异常或 return,这会破坏流契约
- 生产环境建议搭配采样率控制(如每千条记录一次),防止日志爆炸
用 map 或 flatMap 辅助携带上下文信息
如果需要跨多个操作传递临时状态(如处理耗时、原始索引、来源标识),peek 不够用,可借助封装。
- 用 record 或简单 wrapper 类包裹原始元素 + 附加字段(如 timestamp、index、stage)
- 在 map 阶段初始化该包装对象,后续 peek 或 filter 就能访问上下文
- flatmap 可用于拆分并注入批次标识、重试次数等动态状态
- 注意及时解包或转换回原始类型,避免污染下游逻辑
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











