在Flux / Mono中应该使用什么来连接几个项目

时间:2017-11-08 17:03:31

标签: java reactive-programming project-reactor

在JS承诺中你可以使用 Promise.join

但我无法找到Flux / Mono的解决方案。当您处理不同的物品然后必须在以后一起使用它们时,最佳做法是什么?

3 个答案:

答案 0 :(得分:2)

这取决于你想要如何组合它们。 顺序?使用Flux.concat 一切并行?使用Flux.zip 如果您只期望一个结果,Mono.zipWith可能适合您。

答案 1 :(得分:2)

有很多'合并运营商' zip,concat,merge,combine最多是三个。

Zip允许您组合流,其中项目将在流中以1对1的关系分组。这就是你输掉最后一个元素的原因。

如果您不确定每个流的数量以及它将提供事件的频率,您可以使用concat(在第一个流的末尾添加其他流),合并(其中项目放在最终流中)从两个流的出现顺序),或结合最新(将每个流的两个最后事件变为其他)。

你的案子听起来像是合并给我。

答案 2 :(得分:0)

经过一些更改后,我的代码看起来像这样

public Mono<Item> createItem(final @NonNull String userName, String description, String[] tags,
                             @NonNull Flux<ImageDTO> photos) {
    val item = initItem(userName);
    item.setDescription(description);
    if (null != tags) {
        item.getTags().addAll(Arrays.asList(tags));
    }

    return photos.flatMap(photo -> imageService.storeImage(photo.getStream(), photo.getExt()))
        .reduce(item, (item1, photoIri) -> {
            item1.getPhotos().add(photoIri);
            return item1;
        })
        .flatMap(itemRepository::save)
        .flatMap(createdItem -> {
            val itemHistory = getHistoryForCreatedItem(userName, createdItem);
            return itemHistoryRepository.save(itemHistory).then(Mono.just(createdItem));
        });
}

目前我不喜欢:

  • .reduce(item,(item1,photoIri) - &gt;
  • 。然后(Mono.just(createdItem))