You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mutiny中invoke与map操作符差异:为何输出结果不同?

Mutiny中onItem().invoke与map的输出差异原因

这俩操作符的核心定位完全不一样,直接导致了输出差异:

  • onItem().invoke()是副作用操作符:它的作用是在事件流经过时执行一些额外逻辑(比如打日志、更新本地状态),但绝对不会修改原事件流里的数据。你写的x -> return "example"根本没用,invoke会直接忽略这个返回值,原数据(1、2、3...)会原封不动地继续往下传递,最后输出自然还是原来的数字序列。

  • map()是数据转换操作符:它的唯一作用就是替换事件流里的数据。你传入的lambda返回什么,就会把原数据换成什么。所以每次流里的1、2、3...都会被替换成"example",输出就是重复的example字符串。

举个简单的场景对比:
假设原事件流是每隔10秒生成递增数字的重复流,代码大概是:

Multi.createFrom().ticks().every(Duration.ofSeconds(10))
    .map(tick -> tick + 1); // 生成1、2、3...
  • 用invoke处理后:
原流.onItem().invoke(x -> {
    return "example"; // 这个返回值被完全忽略
})
.subscribe().with(System.out::println); // 输出1、2、3...
  • 用map处理后:
原流.map(x -> "example")
.subscribe().with(System.out::println); // 输出example、example...

简单总结:invoke是"路过时做点额外的事,但不改东西",map是"把路过的东西换成新的"。

内容的提问来源于stack exchange,提问作者robyp7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:52:06