2016-08-03 138 views
3

我覺得這是一個愚蠢的問題,但我找不到了,而任何答案,所以我要問,對不起:)RxJava:如何從可觀察對象中提取對象?

所以,我需要做下面的函數:

1)調用另一個函數來創建一個可觀察的用戶

2)獲取從可觀察的用戶

3)用戶對象獲取有關用戶的一些信息,並通過一些邏輯

4)運行返回Observ能夠用戶

我遇到了第2步的麻煩。我怎麼做?或者,這種方法有點根本錯誤嗎?

這裏的功能的 「模式」:

@Override protected Observable buildUseCaseObservable(){ 

    Observable<User> userObservable = userRepository.findUserByUsername(username); 

    //User user = ?????? 

    //if (...) {...} 

    return userObservable; 
} 

謝謝:)

+0

什麼是第一可觀測呢?它是'可觀察的'?你能展示一個[mcve]嗎? –

+0

您可能需要訂閱Observable並與用戶進行操作。 –

+0

@ cricket_007只是添加了一些代碼。是的,這是一個可觀察的。我試圖爲我的android應用程序實現授權,這應該是授權用例的一部分。 –

回答

1

你不能 '提取' 從可觀察到的東西。當您訂閱它們時(如果它們發出任何消息),您可以從可觀察項中獲得項目。由於您要返回的對象是Observable類型,因此您可以應用運算符將​​數據轉換爲鏈接。 RxJava中最常見和易於使用的操作符是'map',它通過應用函數將一種數據形式更改爲另一種形式。

在你的情況,你可以直接使用「地圖」操作上Observable<user>

return userRepository.findUserByUsername(username)  
     .map(new Func1<User, Object>() { 
       @Override 
       public Object call(User u) { 
        // .. 
        // apply your logic here 
        // .. 
        return myDataObject; // return you data here to subcribers 
       } 
      }); 

我希望你知道RxJava的基本知識,也不需要了解如何使用運營商的任何介紹。對於地圖文檔,請遵循以下link

3

可以使用運算符(地圖,flatMap,doOnNext等),通過管道

 Observable.just("hello world") 
       .map(sentence-> sentence.toUpperCase) --> do whatever you need. 
       .subscribe(sentence -> println(sentence) 

讓你觀察到包裹的物體在設計上可觀察到跟隨觀察圖案,它訂閱觀察物並通過管道一次性接收物品。

另外你可以做的是使用觀察者模式,只需從管道中提取對象使用toBlocking。但這是一種反模式,意味着你沒有應用一個好的設計。

  @Test 
public void observableEvolveAndReturnToStringValue() { 
    assertTrue(Observable.just(10) 
         .map(String::valueOf) 
         .toBlocking() 
         .single() 
         .equals("10")); 
} 

你可以看到更多的例子來阻斷這裏https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/utils/ObservableToBlocking.java