RxJava:如何从可观察对象中提取对象?
问题描述:
我觉得这是一个愚蠢的问题,但我找不到了,而任何答案,所以我要问,对不起:)RxJava:如何从可观察对象中提取对象?
所以,我需要做下面的函数:
1)调用另一个函数来创建一个可观察的用户
2)获取从可观察的用户
3)用户对象获取有关用户的一些信息,并通过一些逻辑
4)运行返回Observ能够用户
我遇到了第2步的麻烦。我怎么做?或者,这种方法有点根本错误吗?
这里的功能的 “模式”:
@Override protected Observable buildUseCaseObservable(){
Observable<User> userObservable = userRepository.findUserByUsername(username);
//User user = ??????
//if (...) {...}
return userObservable;
}
谢谢:)
答
你不能 '提取' 从可观察到的东西。当您订阅它们时(如果它们发出任何消息),您可以从可观察项中获得项目。由于您要返回的对象是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
答
可以使用运算符(地图,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
什么是第一可观测呢?它是'可观察的'?你能展示一个[mcve]吗? –
您可能需要订阅Observable并与用户进行操作。 –
@ cricket_007只是添加了一些代码。是的,这是一个可观察的。我试图为我的android应用程序实现授权,这应该是授权用例的一部分。 –