sma*_*ufo 9 java optional rx-java rx-java2
医生说
从概念上讲,它是Single和Completable的联合,提供捕获排放模式的方法,其中可能存在0或1项或由某些反应源发出的错误信号.
但我不确定它的真正含义.它似乎是java8的Optional.
以下两个代码具有相同的结果,但我不知道Maybe可以做什么和Optional不能(或繁琐)做什么.
@Test
public void testMaybe1() {
Observable.just(3, 2, 1, 0, -1)
.map(i -> {
try {
int result = 6 / i;
return Maybe.just(result);
} catch (Exception e) {
return Maybe.empty();
}
})
.blockingForEach(maybe -> {
logger.info("result = {}", maybe.blockingGet());
}
);
}
@Test
public void testMaybe2() {
Observable.just(3, 2, 1, 0, -1)
.map(i -> {
try {
int result = 6 / i;
return Optional.of(result);
} catch (Exception e) {
return Optional.empty();
}
})
.blockingForEach(opt -> {
logger.info("result = {}", opt.orElse(null));
}
);
}
Run Code Online (Sandbox Code Playgroud)
结果是一样的:
result = 2
result = 3
result = 6
result = null
result = -6
Run Code Online (Sandbox Code Playgroud)
在rxJava1中,我的API过去常常返回Observable<Optional<T>>,这是难闻的气味吗?我应该换到Observable<Maybe<T>>吗?
Pra*_*pta 20
Maybe是一个可能有任何一个操作/事件的包装器
但是可选的是围绕着一个包装值即可以是
在您的示例中,在map操作中,计算是同步的(即6/i同步并且可以立即生成值)并且您希望传播值(如果可以除法)或空值(如果不可能除法).因此使用Optional更有意义.
但是还有其他选择:
Maybe会更有意义.如果您对空值和错误原因都不感兴趣,那么您只想跳过传播这些结果.在这种情况下,我会使用a flatMap而不是map.然后,我将不必使用任何Optional或Maybe.
.flatMap(i -> {
try {
int result = 6 / i;
return Observable.just(result);
} catch (Exception e) {
return Observable.empty();
}
})
Run Code Online (Sandbox Code Playgroud)Maybe当你有一个Observable可以发出多个值而你感兴趣的东西时,也就是说,只有第一个值,因此你firstElement()在Observable上使用运算符.这将返回一个Maybe,因为要么存在单个值,要么没有值(如果源Observable在完成之前未发出任何值)或者存在错误(如果在发出任何值之前发生源Observable错误).
与您的问题相关的区别在于,Maybe可以传播错误而不能传播错误Optional- 在您的示例中,无法区分错误和空结果。如果错误处理是很重要的,Optional是无用的,而Maybe有Maybe.error(Throwable)。API明智的,为您的使用情况下,我宁愿Single来Maybe-因为它产生任何错误或单个结果,所以返回类型是Observable<Single<T>>