2016-08-03 72 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