私は一般的にRxJavaとFPにかなり慣れていません。Observable
2 つの sを結合するコードを書きたいと思います。整数のセットが 2 つあるとします。
[0..4]
のモジュロとしてキーセレクターを使用して2
、(key, value) = {(0,0), (1,1), (0,2),...}
[0..9]
のモジュロとしてキーセレクターを使用して3
、(key, value) = {(0,0), (1,1), (2,2), (0,3), (1,4),...}
それらに参加するための私の手順は次のとおりです。
- 各セットをそのキーでグループ化します。1 番目のセットは、 キー
0
とで 2 つのグループを作成します1
。2 つ目は、キー0
、1
およびで 3 つのグループを作成します2
。 - グループの 2 つのセットのデカルト積を作成し、合計で 6 つのグループのペアをキーとして与えます:
0-0
、0-1
、0-2
、1-0
、。1-1
1-2
0-0
と のみを残して、両側に同じキーを持つペアのみをフィルタリングします1-1
。- 各ペア内で、左右のグループのデカルト積を作成します。
以下は、デカルト積を計算するためのヘルパー クラスです。
public class Cross<TLeft, TRight, R> implements Observable.Transformer<TLeft, R> {
private Observable<TRight> _right;
private Func2<TLeft, TRight, R> _resultSelector;
public Cross(Observable<TRight> right, Func2<TLeft, TRight, R> resultSelector) {
_right = right;
_resultSelector = resultSelector;
}
@Override
public Observable<R> call(Observable<TLeft> left) {
return left.flatMap(l -> _right.map(r -> _resultSelector.call(l, r)));
}
}
参加するコードは次のとおりです。
Observable.range(0, 5).groupBy(i -> i % 2)
.compose(new Cross<>(Observable.range(0, 10).groupBy(i -> i % 3), ImmutablePair::new))
.filter(pair -> pair.left.getKey().equals(pair.right.getKey()))
.flatMap(pair -> pair.left.compose(new Cross<>(pair.right, ImmutablePair::new)))
.subscribe(System.out::println);
ただし、出力は正しくありません。
(0,0)
(0,3)
(0,6)
(0,9)
(1,1)
(1,4)
(1,7)
を含む行を削除するfilter
と、結果はまったくありません。正しい出力は、次のように実行する必要があります。
Observable.range(0, 5)
.compose(new Cross<>(Observable.range(0, 10), ImmutablePair::new))
.filter(pair -> pair.left % 2 == pair.right % 3)
.subscribe(System.out::println);
与える:
(0,0)
(0,3)
(0,6)
(0,9)
(1,1)
(1,4)
(1,7)
(2,0)
(2,3)
(2,6)
(2,9)
(3,1)
(3,4)
(3,7)
(4,0)
(4,3)
(4,6)
(4,9)
誰かが動作を説明できますか? どうもありがとう。
注:org.apache.commons.lang3.tuple.ImmutablePair
不思議に思う場合に使用します。