【问题标题】:How to convert Mono object to other Mono object in Spring Webflux如何在 Spring Webflux 中将 Mono 对象转换为其他 Mono 对象
【发布时间】:2021-07-08 01:42:27
【问题描述】:

我有这样的课

public class Person {
      private String name;
      private String age;
      private Boolean student;
      ...
      //
      getters and setters
}
public class PersonDto {
      private List<Person> persons
      private Person president
      //
      getters and setters
}

并从外部 API 获取数据到 webclient

--- omitted ---
final Mono<PersonDto> personDto = wrapperWebClient.getPersonDto(uriComponents, params, PersonDto.class);
Mono<StudentDto> studentDto = convert(personDto);
--- omitted ---

我想像下面这样转换数据 Mono DTO。

public class Student {
      // no constructors 
      private String name;
      private String age;
      private Boolean student;
      ...
      //
      getters and setters
}
public class StudentDto {
      private List<Student> students;
      private Student represent;
      ...
      //
      getters and setters
}

这是我的尝试

--- omitted ---
private Mono<StudentDto> convert(Mono<PersonDto> personDto) {
      StudentDto studentDto = new StudentDto();
      personDto.map(
          persons -> {
              studentDto.setStudents(
                      persons.getPersons()
                       .stream().filter(person -> person.isStudent())
                       .collect(toList())
              );
              studentDto.setRepresent(
                      persons.getRepresent().isStudent()
              );
          }
      )
      return ???;
} 

我的方法似乎是同步的。

【问题讨论】:

标签: java mono reactive-programming spring-webflux project-reactor


【解决方案1】:

您使用flatMap。这是基本反应器,您应该在询问堆栈溢出之前通读Getting started reactor

private Mono<StudentDto> convert(Mono<PersonDto> personDto) {
    return personDto.flatMap(personDto -> {
                final StudentDto studentDto = new StudentDto();
                studentDto.setStudents(
                        persons.getPersons()
                         .stream().filter(person -> person.isStudent())
                         .collect(toList())
                );
                studentDto.setRepresent(
                        persons.getRepresent().isStudent()
                );
                return Mono.just(studentDto);
            })
} 

【讨论】:

    【解决方案2】:

    只需返回Mono 并附上地图

    private Mono<StudentDto> convert(Mono<PersonDto> personDto) {
          return personDto.map(
              persons -> {
                  StudentDto studentDto = new StudentDto();
                  studentDto.setStudents(
                          persons.getPersons()
                           .stream().filter(person -> person.isStudent())
                           .collect(toList())
                  );
                  studentDto.setRepresent(
                          persons.getRepresent().isStudent()
                  );
              }
          );
    } 
    

    mapflatMap 的主要区别在于同步性

    如果你想处理另一个异步,使用flatMap

    或者,如果您只想重新格式化Mono/Flux 的输出,请使用map

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 2019-12-14
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多