关于SpringWebflux的Mono方法的详解

Mono 是 Reactive Extensions (Reactor) 中用于处理异步单值(0 或 1 个元素)的类,通常用于响应式编程。Reactor 是 Java 响应式流的实现,Mono 类是核心组件之一,处理异步任务,类似于 Java 的 CompletableFuture,但更适合响应式编程场景。下面是 Mono 中一些常用方法的详解:

创建 Mono 对象的方法

  1. Mono.just(T data)
    • 创建一个发射单个数据元素的 Mono
    • 示例: Mono.just("Hello, Mono!")
    • 输出: "Hello, Mono!"
  2. Mono.empty()
    • 创建一个不发射任何数据但正常完成的 Mono
    • 示例: Mono.empty()
    • 输出: 无数据,直接完成。
  3. Mono.error(Throwable error)
    • 创建一个立即抛出指定错误的 Mono
    • 示例: Mono.error(new RuntimeException("Error occurred"))
    • 输出: 抛出 "Error occurred" 错误。
  4. Mono.never()
    • 创建一个永远不会发射数据或终止的 Mono
    • 示例: Mono.never()
    • 输出: 永远不会发射,也不会结束。
  5. Mono.fromCallable(Callable callable)
    • Callable 创建 Mono,执行 Callable 并发射其结果。
    • 示例: Mono.fromCallable(() -> "result")
    • 输出: "result"
  6. Mono.fromRunnable(Runnable runnable)
    • Runnable 创建 Mono,运行 Runnable 并返回一个空的 Mono
    • 示例: Mono.fromRunnable(() -> System.out.println("Task done"))
    • 输出: 无数据,直接完成。
  7. Mono.defer(Supplier<Mono> supplier)
    • 当有订阅者时才创建 Mono 实例,允许每次订阅时执行新的逻辑。
    • 示例: Mono.defer(() -> Mono.just("Defer Mono"))
    • 输出: "Defer Mono"

转换和处理数据的方法

  1. map(Function<T, R> mapper)
    • Mono 的元素应用映射函数,并返回映射后的结果。
    • 示例: Mono.just(1).map(i -> i * 2)
    • 输出: 2
  2. flatMap(Function<T, Mono> mapper)
    • 类似于 map,但返回的结果是 Mono,并且将其展开(合并)。
    • 示例: Mono.just(1).flatMap(i -> Mono.just(i * 2))
    • 输出: 2
  3. filter(Predicate predicate)
    • 仅当元素满足条件时发射,否则返回一个空的 Mono
    • 示例: Mono.just(1).filter(i -> i > 0)
    • 输出: 1
  4. then()
    • 忽略当前 Mono 的输出,返回一个新的 Mono<Void>,在完成时发射。
    • 示例: Mono.just("Done").then()
    • 输出: 无数据,直接完成。
  5. then(Mono other)
    • 在当前 Mono 完成后,触发另一个 Mono 的执行。
    • 示例: Mono.just("Hello").then(Mono.just("World"))
    • 输出: "World"
  6. zipWith(Mono other)
    • 将当前 Mono 和另一个 Mono 结合在一起,组合为一个包含两个元素的元组。
    • 示例: Mono.just(1).zipWith(Mono.just(2))
    • 输出: (1, 2)
  7. onErrorReturn(T fallback)
    • 如果发生错误,发射指定的回退值。
    • 示例: Mono.error(new RuntimeException()).onErrorReturn("Fallback")
    • 输出: "Fallback"
  8. onErrorResume(Function<Throwable, Mono> fallbackFunction)
    • 如果发生错误,使用提供的函数来生成新的 Mono 作为回退。
    • 示例: Mono.error(new RuntimeException()).onErrorResume(e -> Mono.just("Recovered"))
    • 输出: "Recovered"

操作方法

  1. doOnNext(Consumer onNext)
    • 在发射元素时执行副作用。
    • 示例: Mono.just(1).doOnNext(i -> System.out.println("Received: " + i))
    • 输出: Received: 1
  2. doOnSuccess(Consumer onSuccess)
    • Mono 成功完成时执行操作。
    • 示例: Mono.just(1).doOnSuccess(i -> System.out.println("Success with: " + i))
    • 输出: Success with: 1
  3. doOnError(Consumer onError)
    • Mono 发生错误时执行操作。
    • 示例: Mono.error(new RuntimeException("Error")).doOnError(e -> System.out.println(e.getMessage()))
    • 输出: "Error"
  4. doFinally(Consumer onFinally)
    • Mono 终止(成功、失败、取消)时执行操作。
    • 示例: Mono.just(1).doFinally(signal -> System.out.println("Finished: " + signal))
    • 输出: Finished: ON_COMPLETE

订阅方法

  1. subscribe()
    • 订阅 Mono,启动执行流。
    • 示例: Mono.just(1).subscribe()
    • 输出: 无输出,但流会被启动。
  2. subscribe(Consumer<? super T> consumer)
    • 订阅 Mono 并对每个元素执行操作。
    • 示例: Mono.just(1).subscribe(System.out::println)
    • 输出: 1
  3. subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError)
    • 订阅并提供处理成功和错误的回调。
    • 示例: Mono.just(1).subscribe(System.out::println, System.err::println)
    • 输出: 1
  4. block()
    • 阻塞直到 Mono 完成并返回发射的元素。
    • 示例: Integer result = Mono.just(1).block()
    • 输出: 1
  5. blockOptional()
    • 阻塞直到 Mono 完成并返回一个 Optional 包装的结果。
    • 示例: Optional<Integer> result = Mono.just(1).blockOptional()
    • 输出: Optional[1]

调度和延迟方法

  1. subscribeOn(Scheduler scheduler)
    • 在指定的调度器上执行订阅操作。
    • 示例: Mono.just(1).subscribeOn(Schedulers.boundedElastic())
    • 输出: 异步执行。
  2. delayElement(Duration duration)
    • 在发射之前延迟指定的时间。
    • 示例: Mono.just(1).delayElement(Duration.ofSeconds(1))
    • 输出: 1 秒后发射 1

Mono 是 Reactor 中非常强大的工具,用于处理单个异步结果,以上方法涵盖了它的核心操作,能够应对各种响应式编程场景。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值