使用takeWhileWithIndex迭代索引数组,然后发出一个observable

时间:2015-07-25 02:40:32

标签: java rx-java

我有一个数字列表,每个数字代表一个索引。 我想逐个查看列表,每个数字都会发出一个可观察的数据。

我该怎么做?

我有这个片段,但我很难理解如何继续......

List<Short> seats = Arrays.asList(new Short[]{0,2,3,1});
rx.Observable.from(seats).takeWhileWithIndex((seatIdx, idx) -> {
    // Here I would like to emit an Observable
    updateGame(seatIdx, idx == 0 ? true : false)
    .subscribe(results -> {
        System.out.println(results);
    });
    return !seats.isEmpty();
}).subscribe();

必须有更好的方法来做到这一点......

如果您有任何想法...... 谢谢!

修改

我想更进一步,在省略4次迭代的循环后(我不关心它的结果),我想继续使用链并连接更多的Observable。

List<Short> seats = Arrays.asList(new Short[]{0,2,3,1});
rx.Observable.range(0, seats.size())
     .zipWith(seats, (idx, seatIdx) -> { 
        return updateGame(seatIdx, idx == 0 ? true : false);
     })
     .takeLast(1)
     .flatMap(x -> x)
     .concatWith(calculatePayout(...))
     .concatWith(persistGame(...))
     .subscribe(results -> {
        System.out.println(results);
     }, e -> {

     }, () -> {
       System.out.println("COMPLETED");
     });

注意,我使用'takeLast(1)'以避免4次调用'calculatePay'! - 有更优雅的方式吗?

1 个答案:

答案 0 :(得分:1)

带有zip

Iterable可为您提供所需内容:

List<Short> seats = Arrays.asList(new Short[]{0,2,3,1});
Observable.range(0, seats.size())
    .zipWith(seats,
            (idx, seatIdx) -> 
                updateGame(seatIdx, idx == 0 ? true : false))
    .flatMap(x -> x)
    .doOnNext(System.out::println)
    .subscribe();