如何在map或flatMap中使用方法引用实现方法



我读这篇文章是为了更好地理解如何处理异步请求,尽管我理解他在这里做什么:

.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-to-PersonInfoDTO到数据库的某种转换,save会插入其中。但我不明白如何使用在.map()中工作的方法引用(:(来实现类似的东西,以便在之后订阅((。

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

public Mono<Object> postPerson(String id, Person json) {
return webClient.post().uri(id).body(Mono.just(json), 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

编辑2:也尝试过这个,不起作用:

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

您可以在任何类中编写responseToDatabaseEntity方法-您可以创建一个处理器或专用转换器,它能够将Entity转换为Data Objects和Vice Versa。

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

例如,我创建了一个专用的变压器

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

你可以在地图功能中参考这种方法,比如:

entityDtoTransformerInstance::responseToDatabaseEntity

此外,您可以使此方法为静态,然后在映射函数中使用它作为

EntityDtoTransformer::responseToDatabaseEntity

如果你的transformer方法是响应类的一部分,你可以

.map(res -> response.responseToDatabaseEntity)

或短格式

.map(Response::responseToDatabaseEntity)

最新更新