Java中的Mono类:是什么,何时使用?

我有以下代码:

import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

@Component
public class GreetingHandler 
    public Mono<ServerResponse> hello(ServerRequest request) {
        return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
        .body(BodyInserters.fromValue("Hello Spring!"));
    }
}

我理解这段代码,除了Mono类的作用及其功能。我做了很多搜索,但它并没有直截了当:什么是类Mono以及何时使用它


答案 1

A 是一种专用的,它最多发出一个项目,然后(可选)以信号或信号终止。它仅提供可用于 的运算符的子集,并且某些运算符(特别是那些将 运算符与另一个运算符组合在一起的运算符)切换到 .例如,返回一段时间返回另一个 .请注意,您可以使用 来表示仅具有完成概念的无值异步进程(类似于 Runnable)。要创建一个,可以使用空的 .Mono<T>Publisher<T>onCompleteonErrorFluxMonoPublisherFluxMono#concatWith(Publisher)FluxMono#then(Mono)MonoMonoMono<Void>

单晶和通量都是反应流。它们在表达的内容上有所不同。单声道是 0 到 1 个元素的流,而通量是 0 到 N 个元素的流。

这两个流的语义差异非常有用,例如,向Http服务器发出请求期望接收0或1响应,在这种情况下使用Flux是不合适的。相反,计算区间上数学函数的结果时,区间内每个数字都有一个结果。在另一种情况下,使用通量是合适的。

如何使用它:

Mono.just("Hello World !").subscribe(
  successValue -> System.out.println(successValue),
  error -> System.error.println(error.getMessage()),
  () -> System.out.println("Mono consumed.")
);
// This will display in the console :
// Hello World !
// Mono consumed.

// In case of error, it would have displayed : 
// **the error message**
// Mono consumed.

Flux.range(1, 5).subscribe(
  successValue -> System.out.println(successValue),
  error -> System.error.println(error.getMessage()),
  () -> System.out.println("Flux consumed.")
);
// This will display in the console :
// 1
// 2
// 3
// 4
// 5
// Flux consumed.

// Now imagine that when manipulating the values in the Flux, an exception
// is thrown for the value 4. 
// The result in the console would be :
// An error as occured
// 1
// 2
// 3
//
// As you can notice, the "Flux consumed." doesn't display because the Flux
// hasn't been fully consumed. This is because the stream stop handling future values
// if an error occurs. Also, the error is handled before the successful values.

来源: 反应堆 Java #1 - 如何创建单声道和通量?单声道, 异步 0-1 结果

它可能会有所帮助:单声道文档


答案 2

推荐