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

为何Flux.fromIterable(Iterable)会调用Iterable.iterator()两次?

关于Flux.fromIterable(Iterable)中iterator()被调用两次的场景解析

Flux.fromIterable(Iterable)的契约里有个有意思的描述:

对于每个订阅者,Iterable.iterator()方法将被至少一次,最多两次调用。

那什么时候这个方法会被调用两次呢?

官方文档的解释可以拆解为:

这个操作符会检查Iterable的Spliterator,以此判断迭代是否能保证是有限的。但如果是默认的Spliterator(即直接包装Iterator的实现),就可能触发两次Iterable.iterator()调用。不过如果是Collection类型的实现,就会跳过第二次调用——因为Collection本身就被认定为一定是有限的。

换个更直白的说法:

  • 当传入的Iterable不是Collection子类时,Reactor会先调用一次iterator()生成默认Spliterator,用来判断迭代是否有限;之后真正推送元素时,会再调用一次iterator()获取遍历用的迭代器,这就造成了两次调用。
  • 而Collection(比如List、Set这类)本身有明确的有限性(可通过size()直接确认),所以Reactor无需通过生成Spliterator来判断,只会调用一次iterator()用于遍历元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:31:58