我在申请减少对Stream<Flux<T>>
的操作时遇到一些问题,我想将其减少为Flux<T>
。每个AdProvider都以Flux的形式提供商品,我想使用流从每个商品中获取所有商品并将它们连接到一个管道中。我怎么可能用reduce做到这一点?
Set<AdProvider> adProviders;
@Override
@LogBefore
public void gather()
{
adProviders
.parallelStream()
.map(this::gatherOffers)
.reduce(?)
.subscribe();
}
private Flux<Ad> gatherOffers(AdProvider adProvider)
{
try
{
return adProvider.offers();
}
catch(Exception e)
{
log.warn(EXCEPTION_WHILE_PROCESSING_OFFERS, adProvider.getClass().getSimpleName(), e);
return Flux.empty();
}
}
答案 0 :(得分:1)
Stream<Flux>
+ Flux#fromStream()
Flux#flatMap()
为了解决该问题,可以结合使用Flux#fromStream()
(将Stream<Flux>
转换为Flux<Flux>
)和Flux#flatMap()
(将内部通量变平为{{1} }),如以下示例所示:
Flux
可能会注意到,我用简单的Set<AdProvider> adProviders;
@Override
public void gather()
{
Flux.fromStream(adProviders.stream())
.parallel() // replace .parallelStream with separate parallel + runOn
.runOn(Schedulers.parallel())
.flatMap(this::gatherOffers)
.subscribe();
}
private Flux<Ad> gatherOffers(AdProvider adProvider)
{
try
{
return adProvider.offers();
}
catch(Exception e)
{
log.warn(EXCEPTION_WHILE_PROCESSING_OFFERS, adProvider.getClass().getSimpleName(), e);
return Flux.empty();
}
}
和parallelStream
+ .stream
替换了parallel
,它们的作用几乎相同。
或者,您可以完全避免使用流,而只需依靠runOn
+相同的Flux.fromIterble
:
Flux#flatMap