RxJava:如何从observable中提取对象?

Dan*_*hov 10 java rx-java

我觉得这是一个愚蠢的问题,但我暂时找不到任何答案,所以我会问它,对不起:)

所以,我需要一个执行以下功能的函数:

1)调用另一个函数来创建一个Observable User

2)从Observable User获取User对象

3)获取有关用户的一些信息并运行一些逻辑

4)返回可观察用户

我在步骤#2遇到了麻烦.我怎么做?或者,这种方法在某种程度上是根本错误的吗?

这是函数的"模型":

@Override protected Observable buildUseCaseObservable(){

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

    //User user = ??????

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

    return userObservable;
}
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

pau*_*aul 8

您可以使用运算符(map,flatMap,doOnNext等)通过管道获取您的observable包装的对象

     Observable.just("hello world")
               .map(sentence-> sentence.toUpperCase) --> do whatever you need.
               .subscribe(sentence -> println(sentence)
Run Code Online (Sandbox Code Playgroud)

按照设计Observable遵循Observer模式,该模式订阅了observable并通过管道发出一次接收项.

另外你可以做的是使用观察者模式,只需使用toBlocking从管道中提取对象.但这是一种反模式,意味着你没有应用好的设计.

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

你可以在这里看到更多关于阻止的例子https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/utils/ObservableToBlocking.java


Raf*_*Ali 3

你无法从可观察的事物中“提取”某些东西。当您订阅它们时,您可以从 observable 中获取项目(如果它们发出任何项目)。由于您返回的对象是 Observable 类型,因此您可以应用运算符将​​数据转换为链接。RxJava 中最常见且易于使用的运算符是“map”,它通过应用函数将一种数据形式更改为另一种形式。

在您的情况下,您可以直接使用“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
                }
            });
Run Code Online (Sandbox Code Playgroud)

我希望您了解 RxJava 的基础知识,并且不需要任何有关如何使用运算符的介绍。如需地图文档,请点击此链接