2

我正在使用 Reactor 2.0.0.M1,我正在尝试过滤一个Stream. 根据我的布尔运算的结果,我想继续使用一个或另一个流。该otherwise()功能似乎可以做到这一点,但不清楚如何使用它。

我的流看起来像这样:

stream.filter(o -> o.isValid());

为了处理正确的情况o.isValid(),我的理解是我可以打电话.map()继续顺流而下。

为了处理错误的情况o.isValid(),我可以访问备用.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));

这真的是最好的方法吗?

4

2 回答 2

4

我通过使用 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 的 key(),并根据 key() 对流执行附加操作。

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

于 2015-01-22T15:55:02.510 回答
0

看起来你想要

stream.filter(o -> {
  if (o.isValid()) {
    return trueOperation(o);
  } else {
    return falseOperation(o);
  }
});
于 2014-12-20T20:14:11.620 回答