Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何将concat与lambda和observeSource一起使用_Kotlin_Rx Java2 - Fatal编程技术网

Kotlin 如何将concat与lambda和observeSource一起使用

Kotlin 如何将concat与lambda和observeSource一起使用,kotlin,rx-java2,Kotlin,Rx Java2,这工作正常,我可以观察到2个可见光 RxJava2 kotlin 这是一个我无法理解的示例,因为它使用了一个lambda,似乎获取了一个observesSource,我想将这两个observes合并,但它会导致一个null异常。只是想知道我在这方面做错了什么。将lambda与concat一起使用的目的是什么 Observable.concat(countries(), animals()) .subscribeBy {

这工作正常,我可以观察到2个可见光

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);
}