gpt4 book ai didi

java - rxjava2的Maybe和Optional有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:03:35 24 4
gpt4 key购买 nike

医生说

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 曾经返回 Observable<Optional<T>> , 有难闻的气味吗?我应该改为 Observable<Maybe<T>> 吗? ?

最佳答案

Maybeoperation/event 的包装器,它可能有

  1. 单个结果
  2. 没有结果
  3. 错误结果

但是 Optional 是一个的包装器,它可能是

  1. 出席
  2. 缺席

在您的示例中,在 map 中操作,计算是同步的(即 6/i 是同步的并且可以立即产生一个值)并且您想要传播一个值(如果可以进行除法)或空值(如果不可能进行除法)。因此使用 Optional更有意义。

但是还有其他选择:

  • 如果您想传播无法进行除法的原因,那么您需要报告发生的异常。在这种情况下使用 Maybe会更有意义。
  • 如果您对空值和错误原因都不感兴趣,那么您只想跳过传播这些结果。在这种情况下,我会使用 flatMap而不是 map .然后我将不必使用任何 OptionalMaybe .

    .flatMap(i -> { 
    try {
    int result = 6 / i;
    return Observable.just(result);
    } catch (Exception e) {
    return Observable.empty();
    }
    })

Maybe当你有 Observable 时也很有用可以发出多个值,但您只对第一个值感兴趣,因此您使用 firstElement() Observable 上的运算符。这会返回一个 Maybe 因为要么只有一个值,要么没有值(如果源 Observable 在完成之前没有发出任何值)或者有一个错误(如果源 Observable 在发出任何值之前出错)。

关于java - rxjava2的Maybe和Optional有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com