【问题标题】:How to use combinators with zip iterable如何使用带有 zip 可迭代的组合器
【发布时间】:2019-08-14 22:05:49
【问题描述】:

接受可迭代的 zip 将我的对象转换为 Object[] 与合并。压缩后,我无法执行其他转换,因为我丢失了对象类型。这与流的 reduce 组合器的概念相同吗?只是想知道如何正确使用它。谢谢。

final List<Object[]> list = Flux
        .zip(List.of(Mono.just("hello"), Mono.just("world")), objects -> objects)
        .collectList().block();

final List<String> strings = Flux
        .merge(List.of(Mono.just("hello"), Mono.just("world")))
        .collectList().block();

【问题讨论】:

    标签: spring-webflux project-reactor


    【解决方案1】:

    看起来 zip 函数的第一个参数采用 Iterable&lt;? extends Publisher&lt;?&gt;&gt;,问号表示它可以采用任何对象。

    它的第二个参数Function&lt;? super Object[],? extends O&gt;是一个函数,第一个参数是“某物”,它是一个数组中的对象,第二个参数是“某物”,它扩展了一个具体类型。

    很遗憾你会得到一个Object[],它就是这样写的。您可以将对象投射到正确的位置。

    我以前从未使用过它,但我玩了一下。

    final Flux<String> helloWorldString = Flux.zip(List.of(Mono.just("hello"), Mono.just(" "), Mono.just("world")), objects -> {
            StringBuilder value = new StringBuilder();
            for (var object : objects) {
                value.append((String) object);
            }
    
            return value.toString();
        });
    

    由于它是一个组合器,我认为它的目的是获取任何 objects[] 并构建一个具体类型。

    【讨论】:

      【解决方案2】:

      目前这是一个 API 限制,因为未捕获 Iterable 的 Publisher 的泛型类型,因此该方法中您无法获得类型信息。这意味着如果您想在此处保留类型信息,很遗憾您将不得不做一些不安全的事情。

      为获得List&lt;String[]&gt; 对当前代码进行最微不足道的更改如下:

      final List<String[]> list = Flux
              .zip(List.of(Mono.just("hello"), Mono.just("world")), objects -> Arrays.stream(objects).toArray(String[]::new))
              .collectList().block();
      

      ...当然,您确实会失去类型安全性。

      根据您的用例(一般来说,如果您的组合器可以一次组合一个元素而不是一次组合所有元素),您也可以在减速器中使用Flux.zip()

      List<Flux<String>> l = new ArrayList<>();
      l.add(Flux.just("hello", "me"));
      l.add(Flux.just("world", "hungry"));
      
      final List<String> strings = Flux.fromIterable(l)
              .reduce((a, b) -> Flux.zip(a, b, (x, y) -> x + ", " + y))
              .flatMap(x -> x.collectList())
              .block();
      

      它不是等效的,但可能是一种类型安全的替代方案,具体取决于您的需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 2020-12-22
        • 2019-06-03
        • 2015-12-05
        • 2019-11-29
        • 2013-08-01
        相关资源
        最近更新 更多