将Mono字段映射到链方法

时间:2019-05-27 06:48:27

标签: java java-stream spring-webflux

我一般来说对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()));
    }

基本上,我要实现的是使用“ getRandomPlanetName()”返回一个新的Planet名称,同时在“ 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));
   }

还可以让我只返回一个字符串,它是getPlanetName()的结果,而不是对象的Mono的结果吗?

1 个答案:

答案 0 :(得分:0)

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

@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())));
}