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

