Random rand = new Random();
Observable<Integer> random1 = Observable.just(rand.nextInt());
Observable<Integer> random2 = random1.flatMap(r1->Observable.just(r1 * rand.nextInt()));
random2.subscribe(System.out::println);
上面的代码只是取几个随机数,将它们相乘,然后打印输出。
这是我的问题:在我打印出结果时,是否有一种优雅的方式可以获得第一个随机值?请注意,我的实际系统正在进行异步调用,而不仅仅是生成随机数。
以下是我不会考虑优雅的一些例子:
Random rand = new Random();
Observable<Integer> random1 = Observable.just(rand.nextInt());
random1.subscribe(r1->{
Observable<Integer> random2 = Observable.just(r1 * rand.nextInt());
random2.subscribe(r2->{
System.out.println(r1);
System.out.println(r2);
});
});
Random rand = new Random();
Observable<Integer> random1 = Observable.just(rand.nextInt());
Observable<int[]> result = random1.flatMap(r1->{
int[] pair = new int[2];
pair[0] = r1;
pair[1] = r1 * rand.nextInt();
return Observable.just(pair);
});
result.subscribe(pair-> {
System.out.println(pair[0]);
System.out.println(pair[1]);
});
Random rand = new Random();
int[] hack = new int[1];
Observable<Integer> random1 = Observable.just(rand.nextInt()).doOnNext(r1->hack[0]=r1);
Observable<Integer> random2 = random1.flatMap(r1->Observable.just(r1 * rand.nextInt()));
random2.subscribe(r2->{
System.out.println(hack[0]);
System.out.println(r2);
});
最后,有这个,我不确定是不是很好的做法:
Random rand = new Random();
Observable<Integer> random1 = Observable.just(rand.nextInt());
Observable<Integer> random2 = random1.flatMap(r1->Observable.just(r1 * rand.nextInt()));
random2.subscribe(r2-> System.out.println(random1.toBlocking().first()));
答案 0 :(得分:1)
简答:不。
你最干净的选择很可能是建立一个班级来包装&#34;你的输入并沿链传递(或使用某种元组类)。
你传递int[]
对的第三个例子是最接近的:
Random rand = new Random();
Observable.just(rand.nextInt())
.flatMap(r1->{
int[] pair = new int[2];
pair[0] = r1;
pair[1] = r1 * rand.nextInt();
return Observable.just(pair);
})
.subscribe(pair-> {
System.out.println(pair[0]);
System.out.println(pair[1]);
});
This question是类似的,值得一看 - 它似乎表明你的第一个方法(嵌套observables以获得对外部observables输入的访问)是最好的。如果您关注的链上有多个级别,这可能会导致一些相当深的嵌套。
答案 1 :(得分:1)
有一个flatMap
重载,允许您指定一个接收源值的Func2,并且Observable中的每个值都被展平:
Random rand = new Random();
Observable<Integer> random1 = Observable.just(rand.nextInt());
Observable<List<Integer>> random2 = random1.flatMap(
r1 -> Observable.just(r1 * rand.nextInt()),
(r1, r2) -> Arrays.asList(r1, r2));
random2.subscribe(System.out::println);
答案 2 :(得分:0)
zip运营商怎么样?
Random rand = new Random();
Observable<Integer> random1 = Observable.just(rand.nextInt());
Observable<Integer> random2 = Observable.just(rand.nextInt());
random1.zipWith(random2, Pair::new).subscribe(System.out::println);