将 Mono 字段映射到链方法

Map a Mono field to a chain method

总的来说,我对 Spring WebFlux 和 Reactive 编程比较陌生,所以请原谅我的问题,因为它没有任何意义。

我有一个简单的@PostMapping 方法,我试图将 Mono 中的一个字段映射到另一个链方法:

   @PostMapping
   public Mono<Delay> getPlanetNames(@RequestBody Mono<Delay> delayBody) {
      return delayBody
          .map(p -> new Delay(p.getDelayTime(), getRandomPlanetName()))
          .delayElement(Duration.ofMillis(50));
   }

    public String getRandomPlanetName() {
        Random rand = new Random();
        List<String> list = Stream.of(
                "Mercury",
                "Neptune")
                .collect(Collectors.toList());
        return list.get(rand.nextInt(list.size()));
    }

基本上我想要实现的是 return 一个新的 Planet 名称 "getRandomPlanetName()",同时在 Delay 对象中设置一个带有字段的 "delayElement"。像这样:

   @PostMapping
   public Mono<Delay> getPlanetNames(@RequestBody Mono<Delay> delayBody) {
      return delayBody
          .map(p -> new Delay(p.getDelayTime(), getRandomPlanetName()))
          .delayElement(Duration.ofMillis(delayBody.getDelayTime));
   }

此外,我是否可以 return 只是一个字符串,它是 getPlanetName() 的结果而不是对象的 Mono?

基本上这会查看 Mono<Delay> 的延迟时间,并用此 delayElement(delayTime) 创建另一个 Mono

@PostMapping
public Mono<String> getPlanetNames(@RequestBody Mono<Delay> delayBody) {
  return delayBody.flatMap(p -> {
    return Mono.just(getRandomPlanetName())
        .delayElement(Duration.ofMillis(p.getDelayTime()));
  });
}

private String getRandomPlanetName() {
  Random rand = new Random();
  List<String> list = Arrays.asList("Mercury", "Neptune");
  return list.get(rand.nextInt(list.size()));
}

为了更好的人类可读性,我放在 {} 中,您也可以这样写:

@PostMapping
public Mono<String> getPlanetNames(@RequestBody Mono<Delay> delayBody) {
  return delayBody.flatMap(p -> Mono.just(getRandomPlanetName()).delayElement(Duration.ofMillis(p.getDelayTime())));
}