2017-03-18 2 views
1

私はブロック方法がList<UUID> listOf(int page)と呼ばれるとしましょう。私はこのような何かをページ分割したい場合は 、1つのアイデアは、このような何かを行うことです。どのようにconcatWith以前のObservableの情報をページングに使用する

public Observable<UUID> allOf(int initialPage) { 
    return fromCallable(() -> listOf(initialPage)) 
      .concatWith(fromCallable(() -> allOf(initialPage + 1))) 
      .flatMap(x -> from(x)); 
} 

私のサービスは、次の要素を見つけるために、ページ番号が、リストの最後の要素を使用していない場合は、どのようにすることができます私はRxJavaとそれを達成する?

私はまだallOf(0).take(20)のようなことをして、concatWithで、最初のものが完了したときに2番目のObservableへの呼び出しを取得したいと思います。

しかし、以前の電話からの情報が必要な場合はどうすればいいですか?

答えて

1

あなたはシーケンスの先頭に次のページ番号を返送する対象を使用することができます。

List<Integer> service(int index) { 
    System.out.println("Reading " + index); 
    List<Integer> list = new ArrayList<>(); 
    for (int i = index; i < index + 20; i++) { 
     list.add(i); 
    } 
    return list; 
} 

Flowable<List<Integer>> getPage(int index) { 
    FlowableProcessor<Integer> pager = UnicastProcessor.<Integer>create() 
     .toSerialized(); 
    pager.onNext(index); 

    return pager.observeOn(Schedulers.trampoline(), true, 1) 
    .map(v -> { 
     List<Integer> list = service(v); 
     pager.onNext(list.get(list.size() - 1) + 1); 
     return list; 
    }) 
    ; 
} 

@Test 
public void testPager() { 
    getPage(0).take(20) 
    .subscribe(System.out::println, Throwable::printStackTrace); 
} 
+0

なぜトランポリンを? – dierre

+0

再帰的なonNext呼び出しを回避します。 – akarnokd

関連する問題