假设我有一个包含Flux<String> firstLetters
的"A", "B", "C", "D"
和包含"X", "Y", "Z"
的Flux<String> lastLetters
我有一个通量包含了很多:
data class Example(val name: String)
从整个Flux<Example>
中,我想将元素拆分为两个变量:一个Flux<Example>
包含所有的name IN ("A", "B", "C", "D")
,第二个Flux<Example>
有名称IN ("X", "Y", "Z")
,并保存这两个流量两个变量。
是否可以在一个流程中这样做,而不首先对firstLetters
执行相同的逻辑,然后对lastLetters
执行相同的逻辑操作?
发布于 2019-08-07 10:25:52
是否可以在一个流程中这样做,而不首先对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
提取到一个单独的方法中。
发布于 2019-08-06 15:36:51
如果Flux<String> firstLetters/lastLetters
可以被Set<String> firstLetters/lastLetters
替换,那么您可以很容易地利用Flux<Example>
上的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<K, V>::key
来获得这个组。
https://stackoverflow.com/questions/57377007
复制相似问题