2

Reactor 2.0.0.M1 を使用しており、Stream. ブール演算の結果に応じて、いずれかのストリームを続行したいと考えています。これは関数で可能であるように見えますotherwise()が、その使用方法は明確ではありません。

マイ ストリームは次のようになります。

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

が trueの場合を処理するには、ストリームを続行するために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));

それは本当に最善の方法ですか?

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() 内で、ストリームの 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 に答える