Kotlin 如何将concat与lambda和observeSource一起使用
这工作正常,我可以观察到2个可见光Kotlin 如何将concat与lambda和observeSource一起使用,kotlin,rx-java2,Kotlin,Rx Java2,这工作正常,我可以观察到2个可见光 RxJava2 kotlin 这是一个我无法理解的示例,因为它使用了一个lambda,似乎获取了一个observesSource,我想将这两个observes合并,但它会导致一个null异常。只是想知道我在这方面做错了什么。将lambda与concat一起使用的目的是什么 Observable.concat(countries(), animals()) .subscribeBy {
RxJava2
kotlin
这是一个我无法理解的示例,因为它使用了一个lambda,似乎获取了一个observesSource,我想将这两个observes合并,但它会导致一个null异常。只是想知道我在这方面做错了什么。将lambda与concat一起使用的目的是什么
Observable.concat(countries(), animals())
.subscribeBy {
println(it)
}
这是我所指的可观察资源的接口
Exception in thread "main" java.lang.NullPointerException
at io.reactivex.internal.operators.observable.ObservableConcatMap$SourceObserver.onNext(ObservableConcatMap.java:129)
公共接口可观察资源{
void subscribe(@NonNull Observer将lambda传递给concat解析为。因为observatesource
是一个具有单个非默认方法的接口,这会触发Kotlin。这就是它选择该重载的原因-它是唯一一个具有可以通过SAM转换实现的接口的接口
因此,lambda是该方法的实现。该方法记录如下:
将给定的观察者订阅到此ObservableSource实例
因此,lambda需要将参数(it
)订阅到可观察对象的源中。您得到的是NullPointerException
,因为您没有订阅它,而是开始在尚未订阅的观察者上调用onNext
,因此具有不正确的内部状态(在本例中,有一个队列尚未设置,但这并不特别重要)
为了实现该方法的契约,您只需创建一个发出Observable
的Observable
并订阅it
(Observable
)到lambda中的Observable
,如下所示:
Observable.concat{
可观察的。只是(国家(),动物())。订阅(它)
}.订阅人{
println(it)
}
我已经在本地测试过了,它产生了预期的结果。谢谢你的回答。只是想知道为什么我们需要订阅两次。当测试subscribeBy{println(it)}
永远不会被调用您订阅两次,因为有两个不同的观测者-一个订阅发射其他可见光的可见光,以便将它们连接起来,另一个订阅连接发射(字符串s)。您能澄清一下您的意思吗“在测试subscribeBy{println(it)}
时,从不调用"?肯定会调用println
,它会打印所有的值,subscribeBy
也必须被调用,才能订阅println
。在lambda中还有什么可以做的吗?简单问一下,这是什么意思?Lambdas一般,还是在gen中传递给concat?Lambdas的lambda中eral:接受SAM转换的类型的任何内容。lambda传递给concat:您可以放入任何您想要的代码,但它必须将参数订阅到可观察的,以获得预期结果。不过,您可以动态生成可观察的,因此可以拥有块代码的定义。
Exception in thread "main" java.lang.NullPointerException
at io.reactivex.internal.operators.observable.ObservableConcatMap$SourceObserver.onNext(ObservableConcatMap.java:129)
public interface ObservableSource<T> {
void subscribe(@NonNull Observer<? super T> observer);
}