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

13

我觉得这是一个愚蠢的问题,但我找不到答案一段时间了,所以我要问一下,抱歉:)

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

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

2)从Observable User中获取User对象

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

4)返回Observable User

我在第二步遇到了麻烦。我该怎么做?或者,这种方法是否基本上是错误的?

这是该函数的“模型”:

@Override protected Observable buildUseCaseObservable(){

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

    //User user = ??????

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

    return userObservable;
}

谢谢你 :)


第一个Observable是做什么的?它是Observable<User>吗?你能展示一个[mcve]吗? - OneCricketeer
你可能需要订阅 Observable 并对用户执行操作。 - OneCricketeer
@cricket_007 刚刚添加了一些代码。是的,它是一个 observable<User>。我正在尝试为我的 Android 应用实现授权,这应该是授权用例的一部分。 - Daniil Orekhov
2个回答

8
你可以使用操作符(map,flatMap,doOnNext等)通过管道获取包装在可观测对象内的对象。
     Observable.just("hello world")
               .map(sentence-> sentence.toUpperCase) --> do whatever you need.
               .subscribe(sentence -> println(sentence)

Observable 的设计遵循观察者模式,订阅 Observable 并通过管道发射的项目一旦被发射,就会接收到。

另外,您可以使用 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


3
你无法从Observable中“提取”某个东西。当你订阅Observable时(如果它们发出任何内容),你会从Observable获取项目。由于你返回的对象是Observable类型,所以可以使用操作符将数据转换为所需形式。在RxJava中最常用且易于使用的操作符是“map”,它通过应用函数将一种形式的数据更改为另一种形式。
在你的情况下,你可以直接在`Observable`上使用'map'操作符。
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的基础知识,并不需要介绍如何使用操作符。有关map的文档,请转到此链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接