rxjava2的Maybe和Optional有什么区别?
What's the difference between rxjava2's Maybe and Optional?
文档说
Conceptually, it is a union of Single and Completable providing the
means to capture an emission pattern where there could be 0 or 1 item
or an error signalled by some reactive source.
但我不确定它的真正含义。好像是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));
}
);
}
结果是一样的:
result = 2
result = 3
result = 6
result = null
result = -6
在rxJava1中,我的API习惯了returnObservable<Optional<T>>
,是不是味道不好?我应该改为 Observable<Maybe<T>>
吗?
RxJava 2 个目标 Java 6. 这意味着没有内置 Optional
支持保证,他们必须自带。类似于他们必须携带自己的 Function
类型。
如果你的 application/library 只支持 Java >= 8 你可以使用更适合你的。
与您的问题相关的区别在于 Maybe
可以传播错误,而 Optional
不能 - 在您的示例中,无法区分错误和空结果。如果错误处理很重要,Optional
是没用的,而 Maybe
有 Maybe.error(Throwable)
。 API-wise,对于您的用例,我更喜欢 Single
而不是 Maybe
- 因为它会产生错误或单个结果,所以 return 类型将是 Observable<Single<T>>
Maybe
是 operation/event 的包装,可能有
- 一个结果
- 无结果
- 错误结果
但是 Optional 是一个 value 的包装器,它可以是
- 现在
- 缺席
在您的示例中,在 map
操作中,计算是同步的(即 6/i
是同步的并且可以立即产生一个值)并且您想要传播一个值(如果除法是可能)或空值(如果不可能除法)。因此使用 Optional
更有意义。
但是还有其他选择:
- 如果您想传播为什么除法是不可能的,那么您会想要报告发生的异常。在这种情况下,使用
Maybe
会更有意义。
如果您对空值和错误原因都不感兴趣,那么您只想跳过传播这些结果。在这种情况下,我会使用 flatMap
而不是 map
。然后我将不必使用 Optional
或 Maybe
中的任何一个。
.flatMap(i -> {
try {
int result = 6 / i;
return Observable.just(result);
} catch (Exception e) {
return Observable.empty();
}
})
Maybe
当你有一个可以发出多个值但你感兴趣的 Observable
时也很有用,比方说,只有第一个,因此你使用 firstElement()
Observable 上的运算符。这个 returns a Maybe 因为要么只有一个值,要么没有值(如果源 Observable 在完成之前没有发出任何值)或者有错误(如果源 Observable 在发出任何值之前出错)。
Maybe
是零个或一个事物的惰性流(作为一个流可能会导致错误)。 Optional
不是懒惰,它要么存在要么不存在。 Optional
没有延迟计算的意义,而 Maybe
.
有延迟计算的意义
文档说
Conceptually, it is a union of Single and Completable providing the means to capture an emission pattern where there could be 0 or 1 item or an error signalled by some reactive source.
但我不确定它的真正含义。好像是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));
}
);
}
结果是一样的:
result = 2
result = 3
result = 6
result = null
result = -6
在rxJava1中,我的API习惯了returnObservable<Optional<T>>
,是不是味道不好?我应该改为 Observable<Maybe<T>>
吗?
RxJava 2 个目标 Java 6. 这意味着没有内置 Optional
支持保证,他们必须自带。类似于他们必须携带自己的 Function
类型。
如果你的 application/library 只支持 Java >= 8 你可以使用更适合你的。
与您的问题相关的区别在于 Maybe
可以传播错误,而 Optional
不能 - 在您的示例中,无法区分错误和空结果。如果错误处理很重要,Optional
是没用的,而 Maybe
有 Maybe.error(Throwable)
。 API-wise,对于您的用例,我更喜欢 Single
而不是 Maybe
- 因为它会产生错误或单个结果,所以 return 类型将是 Observable<Single<T>>
Maybe
是 operation/event 的包装,可能有
- 一个结果
- 无结果
- 错误结果
但是 Optional 是一个 value 的包装器,它可以是
- 现在
- 缺席
在您的示例中,在 map
操作中,计算是同步的(即 6/i
是同步的并且可以立即产生一个值)并且您想要传播一个值(如果除法是可能)或空值(如果不可能除法)。因此使用 Optional
更有意义。
但是还有其他选择:
- 如果您想传播为什么除法是不可能的,那么您会想要报告发生的异常。在这种情况下,使用
Maybe
会更有意义。 如果您对空值和错误原因都不感兴趣,那么您只想跳过传播这些结果。在这种情况下,我会使用
flatMap
而不是map
。然后我将不必使用Optional
或Maybe
中的任何一个。.flatMap(i -> { try { int result = 6 / i; return Observable.just(result); } catch (Exception e) { return Observable.empty(); } })
Maybe
当你有一个可以发出多个值但你感兴趣的 Observable
时也很有用,比方说,只有第一个,因此你使用 firstElement()
Observable 上的运算符。这个 returns a Maybe 因为要么只有一个值,要么没有值(如果源 Observable 在完成之前没有发出任何值)或者有错误(如果源 Observable 在发出任何值之前出错)。
Maybe
是零个或一个事物的惰性流(作为一个流可能会导致错误)。 Optional
不是懒惰,它要么存在要么不存在。 Optional
没有延迟计算的意义,而 Maybe
.