回顾RxJava中的链条

时间:2015-02-13 23:54:22

标签: java reactive-programming rx-java

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()));

3 个答案:

答案 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);