如何省略transformToIterable,将CompletableFuture<List>转为Mutiny Multi流?
简化Multi从CompletableFuture
- 创建流的写法
我有一个返回CompletableFuture<List<Integer>>的方法:
public CompletableFuture<List<Integer>> getStuffAsync()
目前我是这样把它转换成包含单个Integer元素的Multi<Integer>流的:
Multi<Integer> stream = Multi .createFrom().completionStage(() -> getStuffAsync()) .onItem().transformToIterable(Function.identity())
为了让代码更简洁美观,我想省略掉onItem().transformToIterable()这一步,希望能写成类似Multi.createFrom().completionStageIterable(() -> getStuffAsync())这样的形式。
解决方案
如果Quarkus的Multi API没有直接提供这类现成方法,你可以自己封装一个静态工具方法来实现预期的精简写法:
// 可放在工具类中的静态方法 public static <T> Multi<T> completionStageIterable(Supplier<CompletableFuture<List<T>>> supplier) { return Multi.createFrom().completionStage(supplier) .onItem().transformToIterable(Function.identity()); }
之后使用时就能像你期望的那样简洁:
Multi<Integer> stream = completionStageIterable(this::getStuffAsync);
另外也可以用flatMapIterable来稍微压缩现有代码的写法:
Multi<Integer> stream = Multi.createFrom().completionStage(this::getStuffAsync) .flatMapIterable(Function.identity());
内容的提问来源于stack exchange,提问作者JSelser
相关产品推荐
相关产品推荐

