在Reactor 2.0中处理Stream过滤器的正确方法是什么?

时间:2014-12-19 22:14:33

标签: java spring reactor project-reactor

我正在使用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));

这真的是最好的方法吗?

2 个答案:

答案 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()调用中的操作进行了分块。在我的情况下,我已将对象过滤为truefalse存储桶。

接下来,flatMap()获取多个流,处理它们,然后将输出展平为单个Stream<Object>。在flatMap()中,您可以检查Stream的密钥(),并根据密钥()对流执行其他操作。

然后在flatMap()完成后,再次有一个Stream,可以进行任何你想要的后期处理。

答案 1 :(得分:0)

看起来你想要

stream.filter(o -> {
  if (o.isValid()) {
    return trueOperation(o);
  } else {
    return falseOperation(o);
  }
});