是否有可能在rxjava中获得两个Observable的笛卡尔积?
像这样的东西:
A -> 1,2,3
B -> a,b
A x B -> (1, a), (1, b), (2, a), (2, b), (3, a), (3, b)
是否有可能在rxjava中获得两个Observable的笛卡尔积?
像这样的东西:
A -> 1,2,3
B -> a,b
A x B -> (1, a), (1, b), (2, a), (2, b), (3, a), (3, b)
你想要的是为一个数字生成一对,就像你有字母一样。
所以你可以轻松地使用它 map
和 flatMap
运营商。
Observable<Integer> number = Observable.from(Arrays.asList(1, 2, 3));
Observable<String> letters = Observable.from(Arrays.asList("a", "b"));
Observable<Pair> cartesian = number.flatMap((n) -> letters.map((l) -> new Pair(n, l)));
“加入”不是你想要的吗?
Observable<Integer> a = Observable.fromArray(1, 2, 3);
Observable<String> b = Observable.fromArray("a", "b");
Observable<?> left = Observable.never();
Observable<?> right = Observable.never();
Observable<Pair<Integer, String>> pairs = a.join(b, (aa)->left, (bb)->right, (ai, bi)-> Pair.of(ai, bi));
这是笛卡尔映射的伪。
A -> Pair<A,"letter"> -> C
B -> Pair<B,"number"> -> D
Merge(C,D) -> lift(new CartesianOperator) -> Result
笛卡尔运算符将存储数字列表和字符列表。
如果引入了唯一字符。您可以为唯一字符的每个组合与记录的数字列表生成响应。然后将您的唯一字符添加到章程列表中,然后重复该过程。
您对唯一数字也这样做。
最后,你将能够发送类似1,1,2,3和a,b,b的东西,并收到类似(a,1)(a,2)(a,3)(b,1)的内容(b,2)(b,3)
编辑:
因此,这是一个快速的,无可否认的不可扩展的实现,可以工作。它需要一对物体。
值1是你的'a','b','1','2'或'3',和 值2是您的类型'('数字'或'字符')
它返回映射到数字的可观察字符对。
public class CartesianOperator implements Observable.Operator<Pair<String,String>,Pair<String,String>> {
@Override
public Subscriber<? super Pair<String, String>> call(final Subscriber<? super Pair<String, String>> subscriber) {
return new Subscriber<Pair<String, String>>() {
List<String> numbers;
List<String> characters;
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Pair<String, String> stringStringPair) {
if(stringStringPair.second == "number")
{
if(numbers.size() == 0)
{
numbers.add(stringStringPair.first);
}
else
{
if(numbers.contains(stringStringPair.first))
{}
else
{
for(String temp: characters)
{
//Return Every permutation of existing characters with new number
subscriber.onNext( new Pair<String,String>(temp,stringStringPair.first));
}
}
}
}
else // Assume vallue is a character
{
if(characters.size() == 0)
{
characters.add(stringStringPair.first);
}
else
{
if(characters.contains(stringStringPair.first))
{}
else
{
for(String temp: numbers)
{
//Return Every permutation of existing numbers with new character
subscriber.onNext( new Pair<String,String>(stringStringPair.first,temp));
}
}
}
}
}
};
}
}
如果您不知道对象是什么,它本质上是一个封装其他两个对象的对象。
pairObject.first
返回我的对的第一个对象
pairObject.second
返回我的对的第二个对象
我认为它现在已被弃用了。