RxJava:如何从可观察中提取对象?

2022-09-04 21:51:45

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

因此,我需要一个执行以下操作的函数:

1) 调用另一个函数来创建可观察用户

2) 从可观察用户获取 User 对象

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

4) 返回可观察用户

我在步骤#2中遇到了问题。我该怎么做?或者,这种方法是否从根本上是错误的?

这是函数的“模型”:

@Override protected Observable buildUseCaseObservable(){

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

    //User user = ??????

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

    return userObservable;
}

谢谢:)


答案 1

您可以使用运算符(map,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


答案 2

你不能从可观察量中“提取”一些东西。当您订阅项目时,您将从可观察中获取项目(如果它们发出任何项目)。由于要返回的对象的类型为 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
                }
            });

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


推荐