假设我有
// 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
。
该怎么做?
答案 0 :(得分:4)
有两种可能的解决方案:
map
转为对flatMap
的调用,根据返回值是否为空,返回Observable.just(chooseFile())
或Observable.empty()
。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 }