2017-08-23 4 views
0

ので、私はRxJavaを使用して、リストからちょうど最初の3つの要素を取得し、それらをバック返すようにしたいリストリストのRxJavaでのtake()演算子の使い方は?

List<String> strings = new ArrayList<>(); 
strings.add("a"); 
strings.add("b"); 
strings.add("c"); 
strings.add("d"); 
strings.add("e"); 
strings.add("f"); 
strings.add("g"); 

を持っています。私はちょうどtake()関数を使ってみましたが、オブジェクトとみなされるので、私はリスト全体に戻ります。

私はこの

Observable.just(strings) 
      .concatMap(new Func1<List<String>, Observable<String>>() { 
       @Override 
       public Observable<String> call(List<String> strings) { 
        return Observable.from(strings); 
       } 
      }) 
      .take(3) 
      .toList() 
      .subscribe(new Observer<List<String>>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 

       } 

       @Override 
       public void onNext(List<String> strings) { 
        System.out.print(strings.toString()); 
       } 
      }); 

のようなものをやって成功しましたが、私の意見で行うには多くの操作です。それを行うためのより良い方法ですか?

答えて

0

それは、method referenceを使用して、このように単純化することができます。

Observable.just(strings) 
      .concatMap(Observable::from) 
      .take(3) 
      .subscribe(System.out::println); 

それを簡素化する任意の方法は実際に存在しないよりも、あなたは、Javaの8の機能を使用することを許可されていない場合。 私がここに見るのは、Listに収集するのではなく、ストリーム自体を聞くことです。

Observable.just(strings) 
      .concatMap(new Func1<List<String>, Observable<String>>() { 
       @Override 
       public Observable<String> call(List<String> strings) { 
        return Observable.from(strings); 
       } 
      }) 
      .take(3) 
      .subscribe(new Observer<String>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 

       } 

       @Override 
       public void onNext(String string) { 
        System.out.print(string); 
       } 
      }); 
+0

現在、私は 'Retrolambda'を使用していません。 –

+0

ああ、私は答えを編集しました。 –