我正在使用Reactor 2.0.0.M1,我正在尝试过滤Stream
。根据我的布尔操作的结果,我想继续使用一个或另一个流。 otherwise()
函数似乎可以实现这一点,但不清楚如何使用它。
My Stream看起来像这样:
stream.filter(o -> o.isValid());
要处理o.isValid()
为真的情况,我的理解是我可以致电.map()
继续沿着广告系列。
要处理o.isValid()
为false的情况,我可以访问备用.otherwise()
流。
但似乎没有or()
或类似的方法,因此似乎无法以完全流畅的方式配置两个流。
我能想到的最好的是:
FilterAction<Object> filterAction = stream.filter(o -> o.isValid());
// Returns a 'true' Stream, which might additional operations
filterAction
.map(o -> trueOperation1(o))
.map(o -> trueOperation2(o));
// Returns a 'false' Stream, which might different additional operations
filterAction.otherwise()
.map(o -> falseOperation1(o))
.map(o -> falseOperation2(o));
这真的是最好的方法吗?
答案 0 :(得分:3)
我通过使用groupBy()和flatMap()来解决这个问题。
以下是一个例子:
// your initial stream
Broadcaster<Object> stream = Streams.<Object>broadcast(environment);
stream
.groupBy(o -> o.isValid())
.flatMap(groupedStream -> {
if (groupedStream.key()) {
return groupedStream.map(o -> trueOperation(o));
} else {
return groupedStream.map(o -> falseOperation(o));
}
.map(o -> additionalOperations();
这里发生的是groupBy()将您的Stream转换为Stream<GroupedStream<O>>
。换句话说,一组对象流。每个内部流包含一组对象,这些对象由groupBy()调用中的操作进行了分块。在我的情况下,我已将对象过滤为true
和false
存储桶。
接下来,flatMap()获取多个流,处理它们,然后将输出展平为单个Stream<Object>
。在flatMap()中,您可以检查Stream的密钥(),并根据密钥()对流执行其他操作。
然后在flatMap()完成后,再次有一个Stream,可以进行任何你想要的后期处理。
答案 1 :(得分:0)
看起来你想要
stream.filter(o -> {
if (o.isValid()) {
return trueOperation(o);
} else {
return falseOperation(o);
}
});