2015-09-29 19 views
5

Bazı nedenlerden dolayı, temizleyici ve temizleyici olduğundan, bazen veri yapılarını dönüştürmenin normal java yolu yerine RxOperators kullanmak istiyorum. Örneğin: RxJava Return Bir fonksiyonda abone olunan değer

Observable.from(listOfStrings) 
.filter(string -> string.getNumber() >5) 
.toList() 

gözlenebilir sonucu bekliyordu ve bir işlevde dönmek herhangi bir yolu var mı: Bu yapacağını (ama çalışmıyor):

private String getFilteredString(String string){ 
    Observable.from(listOfStrings) 
     .filter(string -> string.getNumber() >5) 
     .toList() 
     .subscribe(finalStirng -> { 
     return finalString; 
     }) 
} 

cevap

7

yapabilirsiniz

private List<String> getFilteredString(List<String> strings) { 
    return Observable.from(strings) 
     .filter(string -> string.length() > 5) 
     .toList() 
     .toBlocking() 
     .single(); 
} 

GÜNCELLEME: rağmen .toBlocking() kullanarak senkron birine herhangi Observable dönüşümü Yukarıdaki kod tamamen geçerli ve beklendiği gibi çalışacak, bu şekilde kullanılmaması gereken RxJava. Eğer tek amacınız koleksiyon dönüştürmeye ise, bunu yapmak için daha iyi yollar vardır:

+1

evet katılıyorum, ama benim durumumda, ben katılmıyorum: p İlk android olduğum için, bu yüzden java8 yok. Başka bir neden, bu dönüşümleri zaten normal-java tarzında yapmak zorundayım, bu yüzden benim için rxOperators daha temiz. Benim amacımı görüyor musun? –

+0

@ user3806331 Android için başka bir seçenek de Solid'tir https://github.com/konmik/solid – LordRaydenMK

+1

Android (henüz) Stream'e sahip değil ve Guava bir * masif * referans sayısı içeriyor (Android'in 65k dex sınırı için kötü) . RxJava Android uygulamalarında popüler ve Stream vb yerine kullanarak oldukça makul hissediyorum. – Tom

2

x() (link) adlı rx.Observable numaralı örnekte, gözlemlenebilir olanı doğrudan ve akıcı bir şekilde başka bir değere çevirmek için kullanılabilecek bir örnek yöntem vardır. Bu operatörün amacı, Gözlemlenebilir'in diğer türdeki eşzamanlı/eşzamansız veri yapılarına (diğer türdeki gözlemlenebilirler gibi) geçiş yapabilen veya sadece gözlemlenebilir içeriğin içeriklerini içerilen değerlere ayırabilen bir dönüştürme işlevleri deposu oluşturmaktır. Dönüşüm işlevini bir kez yazın ve tekrar tekrar kullanmak için saklayın.

Yöntem imzası: Eşzamanlı listeye gözlemlenebilir bir potansiyel asenkron dönüştürmek için

public <R> R x(Func1<? super OnSubscribe<T>, ? extends R> conversion); 

Kullanımı:

List<Integer> list = Observable.range(1, 10).x(new Func1<OnSubscribe<Integer>, List<Integer>>() { 
    @Override 
    public List<Integer> call(OnSubscribe<Integer> onSubscribe) { 
     List<Integer> allElements = new ArrayList<Integer>(); 
     CountDownLatch latch = new CountDownLatch(1); 
     AtomicReference<Throwable> failure = new AtomicReference<Throwable>(); 
     onSubscribe.call(new Subscriber<Integer>(){ 
      @Override 
      public void onCompleted() { 
       latch.countDown(); 
      } 

      @Override 
      public void onError(Throwable e) { 
       failure.set(e); 
      } 

      @Override 
      public void onNext(Integer t) { 
       allElements.add(t); 
      }}); 
     while (true) { 
      try { 
       latch.await(); 
       break; 
      } catch (InterruptedException e1) { 
       // continue waiting 
      } 
     } 
     Throwable e = failure.get(); 
     if (e != null) 
      throw new RuntimeException(e); 
     return allElements; 

    }}); 
System.out.println(list); 

çıkış

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

bu operatör @Experimental anda olduğuna dikkat edin ve yeniden adlandırılması ("genişletmek") çok olasıdır, ancak e RxJava'daki xperimental işlevselliği changed in any release olabilir.

İlgili konular