pov*_*nko 7 java reactor project-reactor
这是一段代码
@Test
public void test_mono_void_mono_empty() {
Mono.just("DATA")
.flatMap(s -> Mono.just(s.concat("-")
.concat(s))
.doOnNext(System.out::println)
.then())
.switchIfEmpty(Mono.just("EMPTY")
.doOnNext(System.out::println)
.then())
.block();
}
Run Code Online (Sandbox Code Playgroud)
这将向控制台提供以下结果:
DATA-DATA
EMPTY
Run Code Online (Sandbox Code Playgroud)
这意味着第一个链flatMap被识别为空链。
另一方面,Reactor 具有以下由方法返回的MonoEmpty类。最重要的是,该方法说明如下:Mono.empty()
/**
* Create a {@link Mono} that completes without emitting any item.
*
* <p>
* <img class="marble" src="doc-files/marbles/empty.svg" alt="">
* <p>
* @param <T> the reified {@link Subscriber} type
*
* @return a completed {@link Mono}
*/
public static <T> Mono<T> empty() {
return MonoEmpty.instance();
}
Run Code Online (Sandbox Code Playgroud)
没有发出任何项目- 但我Void用then()方法发出了 类型化的对象。
对此的解释是什么?
好的,答案在官方 Java 文档中说The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void。
这意味着它的主要思想只是将 void 返回类型表示为一个类并包含一个Class<Void>公共值。就是这样。此外,它不可实例化,因为构造函数是私有的。所有这些随后意味着我们可以分配给Void变量的唯一值是null始终被识别为 的值empty Mono。
有用的讨论: Java 泛型 void/Void 类型
Mono在发送完成信号之前,给定的值可以不发布任何内容,也可以发布单个值。(它不能发布null- 反应式规范禁止它。) 的泛型类型Mono表示可能发出的对象的类型- 但不能保证它会被发出。
甲Mono<Foo>例如可以发射只是一个完成信号,或实例Foo,然后一个完成信号。
有两种可能不会发布值的常见场景 - 第一种是值是否存在(例如在数据库或集合中搜索项目)。在这种情况下,您仍然会使用 a Mono<SomeType>,它可能会也可能不会发出SomeType实例。第二种情况是如果一个值绝对不会被发布(通常在您只需要通知任务已完成时使用),并且按照惯例,Mono<Void>总是使用它。then(),在你上面的例子中,属于第二种情况。
这Mono<Void>是一个特殊情况的原因是,正如您所指出的,它Void是一个永远无法通过设计实例化的类。因此,没有 的实例这样的东西Void,这意味着Mono永远不能在完成信号之前发出值。
因此,合乎逻辑的结论是类型的发布者Mono<Void>永远不能发出值,只能发出完成信号 - 因此它被如此使用。
| 归档时间: |
|
| 查看次数: |
7320 次 |
| 最近记录: |