如何处理RxJava 2.x中的空值?

时间:2017-04-25 21:17:40

标签: java nullpointerexception rx-java2

假设我有

// binding dialog open to excel 2
      JavaFxObservable
         .actionEventsOf(importExcel2)
         .map(actionEvent -> chooseFile())
         .filter(Objects::nonNull)
         .observeOn(Schedulers.single())
         .subscribe(file -> {
            sourceFile.setFile(file);
            opRunner.runOp(ImportExcelTable2Op.class);
         });

当取消文件选择且流不允许chooseFile()时,事实是null返回null

该怎么做?

2 个答案:

答案 0 :(得分:4)

有两种可能的解决方案:

  1. map转为对flatMap的调用,根据返回值是否为空,返回Observable.just(chooseFile())Observable.empty()
  2. 对结果缺失进行编码,并chooseFile()返回Maybe<File>并将map转为flatMapMaybe。这更准确地编码了语义应该是什么。

答案 1 :(得分:0)

为“可观察的”创建扩展名:

ObservableExt.kt

typealias Mapper<T, R> = (T) -> R?

fun <T, R> Observable<T>.mapOrEmpty(mapper: Mapper<T, R>): Observable<R> {
    return this.flatMap { item ->
        val mapped = mapper.invoke(item)
        if (mapped != null) {
            return@flatMap Observable.just<R>(mapped)
        } else {
            return@flatMap Observable.empty<R>()
        }
    }
}

用法:

任何obj:

 class Profile{ 
        var id: String? = null 
        var name: String? = null 
        }

以防万一:

 val profile = Profile()

 Observable.just(profile)
    .mapOrEmpty { it.name }