如何在Rxjava2中检查记录的存在?

时间:2019-04-22 13:43:48

标签: spring-boot rx-java2 reactive

我已经实现了反应式编程,并且我正在使用Springboot Framework,Rxjava2,反应式Spring数据框架。我有一个关于在记录不存在时将记录保存到mongodb中的方案。

但是当我被动地检查记录时,我发现发射器停止前进了。

下面是我的示例代码。我有4个数据,其中2个不在数据库中。我发现发射器仅处理数据库中存在的数据。

val movies = mutableListOf("Secret Mother (Mainland) - 秘密媽媽","Life For Life - 命情真","Before Dawn - 愛在暴風的日子","The Threat Of Love 2 - Loving ou 我愛你2")

        Observable
            .fromIterable(movies)
            .flatMapMaybe {
                videoInfoService
                    .findVideoByTitle(it)
                    .switchIfEmpty(Maybe.empty())
            }
            .subscribe(object: Observer<VideoInfo>{
                override fun onComplete() {
                    println("on complete ")
                }

                override fun onSubscribe(d: Disposable) {
                    println("on subscribe ")
                }

                override fun onNext(t: VideoInfo) {
                    println("on next: ${t.title}")
                }

                override fun onError(e: Throwable) {
                    e.printStackTrace()
                }

            })

感谢您的指导。我知道Rxjava2不能从我今天早上写的其他文章中继续使用null值,我想应该是处理这种情况的某种方式。

谢谢

2 个答案:

答案 0 :(得分:0)

假设您将记录保存在mongodb中的方法返回Completable:

fun store(movie: Movie): Completable

并且您的videoInfoService.findVideoByTitle方法返回一个Movie实例,您可以将代码更改为:

    Observable
        .fromIterable(movies)
        .flatMapSingle { title ->
            videoInfoService
                .findVideoByTitle(title)
                .switchIfEmpty {
                    Single.defer {
                        val movie = Movie(title)
                        store(movie)
                            .andThen(Single.just(movie))
                    }
                }
        }

答案 1 :(得分:0)

这是我想要的输出。

感谢@Gustavo提供了答案,我从@Gustavo的答案中得到了提示,希望能得出这个答案。

val movies = mutableListOf("Secret Mother (Mainland) - 秘密媽媽","Life For Life - 命情真","Before Dawn - 愛在暴風的日子","The Threat Of Love 2 - Loving ou 我愛你2")

        Observable
            .fromIterable(movies)
            .flatMap {
                videoInfoService
                    .findVideoByTitle(it)
                    .toObservable()
                    .switchIfEmpty{
                        // Save the video
                        save(it)
                    }
            }
            .subscribe(object: Observer<VideoInfo>{
                override fun onComplete() {
                    println("on complete ")
                }

                override fun onSubscribe(d: Disposable) {
                    println("on subscribe ")
                }

                override fun onNext(t: VideoInfo) {
                    println("on next: ${t.title}")
                }

                override fun onError(e: Throwable) {
                    e.printStackTrace()
                }

            })