如何在地图或平面地图中使用方法引用来实现方法

问题描述

我正在阅读 this 以便我可以更好地理解如何处理异步请求,即使我理解他在这里做什么:

.map(processor::responsetoDatabaseEntity) // Create a persistable entity from the response
.map(priceRepository::save)               // Save the entity to the database

我不知道这两种方法将如何实现。假设这个非常简单的代码

public Mono<Response> postMethod(String id,Person json) {
        return webClient.post().uri(id).body(Mono.just(json),Person.class).retrieve().bodyToMono(Response.class);
}

还有响应类,例如:

public class Response implements Serializable{
    
    private static final long serialVersionUID = -4101206629695985431L;
    
    public String statusCode;
    public Date date;
    public PersonInfo data;

我假设 responsetoDatabaseEntity 方法是从 Response 到 PersonInfoDTO 到数据库的某种转换,save 将插入其中。但是我怎么能使用 Method Reference(::) 实现类似的东西,它可以在 .map() 中工作,所以我可以订阅()之后是我不明白的。

编辑: 添加我的进度,但或多或​​少地适应了我在 Person 类中给出的示例:

public Mono<Object> postPerson(String id,Person.class).retrieve().bodyToMono(Response.class).map( c -> {
            List<PersonDTO> list = new ArrayList<PersonDTO>();
            c.data.getRoles().forEach((r) -> {
                PersonDTO dto = new PersonDTO(c.data.getoof(),"something",c.data.getFoo(),r);
                list.add(dto);
            });
            return list;        
        }).map(personController::savePerson).subscribe(); //what I wanted to do
    }

如果我这样做:

    });
    return list;        
}).map(l -> {
        l.
    });

l 包含一个 PersonDTO 列表,如果我这样做:

  .map(l -> {
        l.forEach( f -> {
            f.
        });
    });

f 包含一个人。

我应该如何实现将整个列表发送到方法中插入或一个人发送到save方法。我不能使用像 PersonController::savePerson 这样的静态方法,因为:

@RestController
public class PersonController {

    private final Logger LOG = LoggerFactory.getLogger(getClass());

    @Autowired
    private final PersonInterface personRepository;

    public PersonController(PersonInterface personRepository) {
        this.personRepository = personRepository;
    }

personRepository 不能是 static

EDIT2:也试过这个,不起作用:

public List<PersonDTO> savePerson(List<PersonDTO> list) {
        list.forEach(dto -> {
            personRepository.save(dto);
        });
        return list;
}

解决方法

您可以在任何类中编写 responseToDatabaseEntity 方法 - 您可以创建一个处理器或一个能够转换 Entity to Data Objects 的专用转换器,反之亦然。

在响应流实例上调用的 Map 函数将接受对任何采用 Response 实例的单个参数并返回任何类型的对象的方法的引用。

因此,例如我创建了一个专用转换器

public class EntityDtoTransformer{
    public EntityObject responseToDatabaseEntity(Response response){
        ...
        ...
        return entity;  
    }
}

您可以在 Map 函数中引用此方法,例如:

entityDtoTransformerInstance::responseToDatabaseEntity

此外,您可以将此方法设为静态,然后在地图函数中将其用作

EntityDtoTransformer::responseToDatabaseEntity

如果您的转换器方法是响应类的一部分,您可以

.map(res -> response.responseToDatabaseEntity)

或缩写形式

.map(Response::responseToDatabaseEntity)