如何从Flux <String>中筛选出不包含某些值的Flux <Example>

时间:2019-08-06 13:18:08

标签: project-reactor

因此,假设我有一个包含var doo = new Date("2011-09-24 EST"); 的{​​{1}}和一个包含Flux<String> firstLetters的{​​{1}}

我的助焊剂中含有很多:

"A", "B", "C", "D"

从整个Flux<String> lastLetters中,我想将元素拆分为两个变量:一个包含所有"X", "Y", "Z"的{​​{1}}和另一个名为{{1}的data class Example(val name: String) },并保存这两个磁通量两个变量。

是否可以一次执行一个流程而无需先对Flux<Example>然后对Flux<Example>做相同的逻辑

2 个答案:

答案 0 :(得分:1)

  

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

从问题的角度来看,我不这么认为,因为您必须多次处理每个元素(列表中的每个值一个,以查看其是否包含所需的值。)您可以调用{{1 }}放在cache()上,以确保这些值仅被检索一次,或完全转换为另一个数据结构。

考虑到您仍然必须重新评估,并假设仍然要使用原始的Flux对象,可以在这里很好地使用FluxfilterWhen()

any()

如果您担心那里的代码重复,您当然可以将Flux<Example> firstNames = names.filterWhen(e -> firstLetters.any(e.name::contains)); Flux<Example> lastNames = names.filterWhen(e -> lastLetters.any(e.name::contains)); 拉出到单独的方法中。

答案 1 :(得分:0)

如果可以将Flux<String> firstLetters/lastLetters替换为Set<String> firstLetters/lastLetters,则可以轻松地在Flux::groupBy上利用Flux<Example>方法将其分成不同的组。

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<K, V>::key来获得组。