前言: 這算是我編寫 java reactor時候的工作小結了。
有表如下:
|
|
|
需求: 根據TableMapping
.search, 結合TableA
、TableB
,查詢出詳細數據,也就是
// 例如查詢 search = 1
{
"name":"張三",
"sex":"男",
"school":"一中",
"grade":"高一"
}
操作方式
List<FluxToMono> initData = new ArrayList<>();
return tableMappingRepository.findAllBySearchEquals(1)
.reduce(initData, (rd, next) -> {
rd.add(new FluxToMono(next.getTableType(), next.getMappingId()));
return rd;
})
.flatMap(fMap -> {
FluxToMono aFilter = fMap.stream().filter(f -> DeviceTypeEnum.A.getCode().equals(f.getTableType())).findFirst().orElse(FluxToMono.builder().build());
Mono<TableA> a = tableARepository.findFirstById(aFilter.getMappingId());
FluxToMono bFilter = fMap.stream().filter(f -> DeviceTypeEnum.B.getCode().equals(f.getTableType())).findFirst().orElse(FluxToMono.builder().build());
Mono<NoiseMessageRecord> b = tableBRepository.findFirstById(bFiltert.getMappingId());
return Mono.zip(
a.defaultIfEmpty(TableA.builder().build()),
b.defaultIfEmpty(TableB.builder().build()),
(lambdaA, lambdaB) ->
ShowDataVo.builder()
.name(lambdaA.getName())
.sex(lambdaA.getSex())
.school(lambdaB.getSchool())
.grade(lambdaB.getgrade())
.build());
});
知識點:
- Mono.zip 只認識有值,只要有一個無值就無輸出
- flatMap 要比 map調用要好,畢竟響應式編程還是要符合規范