【问题标题】:How to filter out Flux<Example> that don't contain some value from Flux<String>如何从 Flux<String> 中过滤掉不包含某些值的 Flux<Example>
【发布时间】:2019-08-06 13:18:08
【问题描述】:

假设我有一个 Flux&lt;String&gt; firstLetters 包含 "A", "B", "C", "D" 和 Flux&lt;String&gt; lastLetters 包含 "X", "Y", "Z"

我有一个 Flux 包含许多:

data class Example(val name: String)

从整个 Flux&lt;Example&gt; 中,我想将元素拆分为两个变量:一个 Flux&lt;Example&gt; 包含所有 name IN ("A", "B", "C", "D") 和第二个 Flux&lt;Example&gt; 名称为 IN ("X", "Y", "Z") 并将这两个 Fluxes 保存为两个变量。

是否可以在一个流程中这样做而无需先为firstLetters 执行相同的逻辑,然后为lastLetters 执行相同的逻辑

【问题讨论】:

    标签: project-reactor


    【解决方案1】:

    是否可以在一个流程中这样做而无需先对 firstLetters 然后对 lastLetters 执行相同的逻辑

    就问题而言,我不这么认为,因为您必须多次处理每个元素(列表中的每个值一个,以查看它是否包含您需要的值。)您可以致电cache()在Flux 上,但要确保这些值只被检索一次,或者完全转换为另一个数据结构。

    鉴于无论如何您都必须重新评估,并且假设您仍想坚持使用原始 Flux 对象,filterWhen() 和 any() 可以在这里很好地使用:

    Flux<Example> firstNames = names.filterWhen(e -> firstLetters.any(e.name::contains));
    Flux<Example> lastNames = names.filterWhen(e -> lastLetters.any(e.name::contains));
    

    如果您担心那里的代码重复,当然可以将Predicate 提取到单独的方法中。

    【讨论】:

      【解决方案2】:

      如果Flux&lt;String&gt; firstLetters/lastLetters 可以替换为Set&lt;String&gt; firstLetters/lastLetters,那么您可以轻松地利用Flux&lt;Example&gt; 上的Flux::groupBy 方法将其分成不同的组。

      enum Group {
        FIRST, LAST, UNDEFINED
      }
      
      Group toGroup(Example example) {
        if (firstLetters.contains(example.name)) return FIRST;
        else if (lastLetters.contain(example.name)) return LAST;
        else return UNDEFINED;
      }
      
      Flux<GroupedFlux<Group, Example>> group(Flux<Example> examples) {
        return examples.groupBy(example -> toGroup(example));
      }
      

      然后您可以通过调用GroupedFlux&lt;K, V&gt;::key 来获取该组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-30
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多