Mono
是 Reactive Extensions (Reactor) 中用于处理异步单值(0 或 1 个元素)的类,通常用于响应式编程。Reactor 是 Java 响应式流的实现,Mono
类是核心组件之一,处理异步任务,类似于 Java 的 CompletableFuture
,但更适合响应式编程场景。下面是 Mono
中一些常用方法的详解:
创建 Mono 对象的方法
- Mono.just(T data)
- 创建一个发射单个数据元素的
Mono
。 - 示例:
Mono.just("Hello, Mono!")
- 输出:
"Hello, Mono!"
- 创建一个发射单个数据元素的
- Mono.empty()
- 创建一个不发射任何数据但正常完成的
Mono
。 - 示例:
Mono.empty()
- 输出: 无数据,直接完成。
- 创建一个不发射任何数据但正常完成的
- Mono.error(Throwable error)
- 创建一个立即抛出指定错误的
Mono
。 - 示例:
Mono.error(new RuntimeException("Error occurred"))
- 输出: 抛出
"Error occurred"
错误。
- 创建一个立即抛出指定错误的
- Mono.never()
- 创建一个永远不会发射数据或终止的
Mono
。 - 示例:
Mono.never()
- 输出: 永远不会发射,也不会结束。
- 创建一个永远不会发射数据或终止的
- Mono.fromCallable(Callable callable)
- 从
Callable
创建Mono
,执行Callable
并发射其结果。 - 示例:
Mono.fromCallable(() -> "result")
- 输出:
"result"
- 从
- Mono.fromRunnable(Runnable runnable)
- 从
Runnable
创建Mono
,运行Runnable
并返回一个空的Mono
。 - 示例:
Mono.fromRunnable(() -> System.out.println("Task done"))
- 输出: 无数据,直接完成。
- 从
- Mono.defer(Supplier<Mono> supplier)
- 当有订阅者时才创建
Mono
实例,允许每次订阅时执行新的逻辑。 - 示例:
Mono.defer(() -> Mono.just("Defer Mono"))
- 输出:
"Defer Mono"
- 当有订阅者时才创建
转换和处理数据的方法
- map(Function<T, R> mapper)
- 对
Mono
的元素应用映射函数,并返回映射后的结果。 - 示例:
Mono.just(1).map(i -> i * 2)
- 输出:
2
- 对
- flatMap(Function<T, Mono> mapper)
- 类似于
map
,但返回的结果是Mono
,并且将其展开(合并)。 - 示例:
Mono.just(1).flatMap(i -> Mono.just(i * 2))
- 输出:
2
- 类似于
- filter(Predicate predicate)
- 仅当元素满足条件时发射,否则返回一个空的
Mono
。 - 示例:
Mono.just(1).filter(i -> i > 0)
- 输出:
1
- 仅当元素满足条件时发射,否则返回一个空的
- then()
- 忽略当前
Mono
的输出,返回一个新的Mono<Void>
,在完成时发射。 - 示例:
Mono.just("Done").then()
- 输出: 无数据,直接完成。
- 忽略当前
- then(Mono other)
- 在当前
Mono
完成后,触发另一个Mono
的执行。 - 示例:
Mono.just("Hello").then(Mono.just("World"))
- 输出:
"World"
- 在当前
- zipWith(Mono other)
- 将当前
Mono
和另一个Mono
结合在一起,组合为一个包含两个元素的元组。 - 示例:
Mono.just(1).zipWith(Mono.just(2))
- 输出:
(1, 2)
- 将当前
- onErrorReturn(T fallback)
- 如果发生错误,发射指定的回退值。
- 示例:
Mono.error(new RuntimeException()).onErrorReturn("Fallback")
- 输出:
"Fallback"
- onErrorResume(Function<Throwable, Mono> fallbackFunction)
- 如果发生错误,使用提供的函数来生成新的
Mono
作为回退。 - 示例:
Mono.error(new RuntimeException()).onErrorResume(e -> Mono.just("Recovered"))
- 输出:
"Recovered"
- 如果发生错误,使用提供的函数来生成新的
操作方法
- doOnNext(Consumer onNext)
- 在发射元素时执行副作用。
- 示例:
Mono.just(1).doOnNext(i -> System.out.println("Received: " + i))
- 输出:
Received: 1
- doOnSuccess(Consumer onSuccess)
- 在
Mono
成功完成时执行操作。 - 示例:
Mono.just(1).doOnSuccess(i -> System.out.println("Success with: " + i))
- 输出:
Success with: 1
- 在
- doOnError(Consumer onError)
- 在
Mono
发生错误时执行操作。 - 示例:
Mono.error(new RuntimeException("Error")).doOnError(e -> System.out.println(e.getMessage()))
- 输出:
"Error"
- 在
- doFinally(Consumer onFinally)
- 在
Mono
终止(成功、失败、取消)时执行操作。 - 示例:
Mono.just(1).doFinally(signal -> System.out.println("Finished: " + signal))
- 输出:
Finished: ON_COMPLETE
- 在
订阅方法
- subscribe()
- 订阅
Mono
,启动执行流。 - 示例:
Mono.just(1).subscribe()
- 输出: 无输出,但流会被启动。
- 订阅
- subscribe(Consumer<? super T> consumer)
- 订阅
Mono
并对每个元素执行操作。 - 示例:
Mono.just(1).subscribe(System.out::println)
- 输出:
1
- 订阅
- subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError)
- 订阅并提供处理成功和错误的回调。
- 示例:
Mono.just(1).subscribe(System.out::println, System.err::println)
- 输出:
1
- block()
- 阻塞直到
Mono
完成并返回发射的元素。 - 示例:
Integer result = Mono.just(1).block()
- 输出:
1
- 阻塞直到
- blockOptional()
- 阻塞直到
Mono
完成并返回一个Optional
包装的结果。 - 示例:
Optional<Integer> result = Mono.just(1).blockOptional()
- 输出:
Optional[1]
- 阻塞直到
调度和延迟方法
- subscribeOn(Scheduler scheduler)
- 在指定的调度器上执行订阅操作。
- 示例:
Mono.just(1).subscribeOn(Schedulers.boundedElastic())
- 输出: 异步执行。
- delayElement(Duration duration)
- 在发射之前延迟指定的时间。
- 示例:
Mono.just(1).delayElement(Duration.ofSeconds(1))
- 输出: 1 秒后发射
1
。
Mono
是 Reactor 中非常强大的工具,用于处理单个异步结果,以上方法涵盖了它的核心操作,能够应对各种响应式编程场景。