如何解决如何创建一个实际发出元素的 Mono<Void>?
所以我想创建一个实际发出元素的 Mono<Void>
(或任何 Mono<SomeIgnorableType>
)。
为什么?因为我实际上想运行一个效果,而结果只是暗示该效果已运行,但可以忽略它。
在 Haskell 中,Void 是一种无法居住的类型……就像 Scala 中的 Nothing
。在 Java 中,Void 也是不可居住的,但它的使用更像是 Scala 中的 Unit
类型或 Haskell 中的 ()
(0 arity 元组)。只有一个居民的类型。
好吧,理论太多了。到目前为止我的选择:
-
Mono.just((Void) null)
抛出异常。 -
Mono.empty().single()
(因为我实际上想发出一个事件),当订阅它时以失败告终。还有…… -
Mono.just("something").then()
运行效果,但随后我无法将其与其他单声道链接,因为它只发出完整和错误事件。
那又如何???
解决方法
Java 缺乏空安全意味着单元类型概念不能很好地转换。当人们假设 Void
等同于一个单位类型时,我从来没有被说服。你永远无法通过设计实例化它;您可以假设任何包含 Void
类型的引用都是 null
,我并没有真正将其视为值 - 它更多的是缺少任何值(即无法居住的类型。)
没有什么我认为是 Java 内置的“真实”单元类型,但是您可以通过使用带有单个值的 enum
轻松创建一个:
public enum Unit {UNIT}
如果您的 Mono
类型随后设置为 Unit
,这将满足您的需求 - 您可以不带任何值来完成 Mono
,也可以用一个 {{ 1}} 值(并忽略该值,只是对它存在的事实做出反应),或者用错误完成它。听起来这正是您所追求的。
也就是说,直接回答问题并忽略您是否应该(恕我直言),您可以模拟 Unit
以实际为其分配一个非空值。 Mockito 可以做到没问题,你只需要确保 Mockito is configured so it can mock final classes:
Void
打印:Void v = Mockito.mock(Void.class);
Mono.just(v)
.doOnNext(actualVoid -> System.out.println(actualVoid))
.block();
(这不是我做过的事情,也不觉得有必要做,但这并不妨碍你从技术上做这件事。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。