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
相关产品推荐
相关产品推荐

