2016-06-29 4 views
0

私はrxjavaの新機能です。私は結果を反復することによってrxjavaのリストを取得しようとしています。私はtoList()のような演算子を試しましたがうまくいきません。以下はうまくいきます。しかし、リアクションの視点からより良い方法があるのだろうか?だから、rxjavaでリストを取得する方法は何ですか?

db.loadData().map(new Func1<RealmResults<Data>, List<String>>() { 
     @Override 
     public List<String> call(RealmResults<Data> Datas) { 
      List<String> companies = new ArrayList<String>(5); 
      for (Company company : Datas.get(0).getCompanies()) { 
       companies.add(company.getName()); 
      } 
      return companies; 
     } 
    }).subscribe(new Action1<List<String>>() { 
     @Override 
     public void call(List<String> strings) { 
      showCompanyDialog(strings); 
     } 
    }); 

答えて

1

そのような何か(私はあなたが持っているオブジェクトの種類を知らないと擬似コード):

db.loadData() 
    .map(new Func1<RealmResults<Data>, List<Company>>()) { 
     public List<Company> call(RealmResults<Data> Datas) { 
      return Datas.get(0).getCompanies(); 
     } 
    }).flatMap(new Func1<List<Company>, Observable<Company>>() { 
     @Override 
     public Observable<Company> call(List<Company> companies) { 
      return Observable.from(companies); 
     } 
    }.map(new Func1<Company, String>() { 
     public Stringcall(Company company) { 
      return company.getName(); 
     } 
    }).toList(); 

意味:

  1. がデータベース
  2. からの結果をゲットRealmResultの企業
  3. 企業に分割
  4. は、Java 8のため申し訳ありませんList<String>
+0

、(道をブロッキング)会社名のリストを「フラット化」を取得するために私はそれが問題の一部ではないですけど、多分皆さんはRetrolambdaが役立つでしょう。これはjava 5、6、7用のJava 8 lambdaのバックポートです。https://github.com/orfjackal/retrolambda – Pato94

+1

Retrolambdaには1つのマイナスがあります。自動的に正しいタイプが追加されるわけではありません。あなたがRxJavaを学んでいるとき、何かを書くときにあなたは狂ってしまいます。あなたは最初に入力と出力のパラメータを知る必要があります。 Func1またはFunc2インターフェイス。 私はretrolambdaを試みましたが、その場合からの使用を決断しませんでした。今、私がRxJavaをよく知っているときは、次のプロジェクトでそれを試してみましょう。 –

0

に各企業

  • を連結の名前すべての結果を取得しますが、それは、これは理にかなっていることを唯一の方法です:

    db.loadData() 
        .flatMapIterable(results -> results) 
        .flatMapIterable(data -> data.getCompanies()) 
        .toList() 
        .subscribe(this::showCompanyDialog); 
    

    は、それはあまりないですもっと簡潔ですか?

  • +0

    あなたはretrolambadaなしで通常のバージョンにそれを展開していただけますか? – Kordova

    0

    List<String> names = db.loadData() 
        .map(datas -> datas.get(0).getCompanies()) 
        .flatMap(companies -> Observable.from(companies)) 
        .map(company -> company.getName()) 
        .toList() 
        .toBlocking() 
        .single() 
    
    関連する問題