[英]How to iterate over Flux and use result from another Mono to filter the Flux
Mono<MyObj1> mono1 = repository.get(id); // data from reactive mongo
Flux<MyObj2> availabilityInfo = getAvailabilityInfo(); // blocking I/O call
我要實現的目標是迭代AvailabilityInfo,需要使用單聲道數據應用某些條件並返回MyObj2(該日期包含delieveryDate和價格相關信息)。
我將嘗試在天真的編碼中解釋如下
foreach(MyObj2 obj : availabilityInfo){
if(MyObj1.getX() && obj.getY()){
return or break;
}
}
我想從滿足條件的通量中發出第一個元素MyObj1.getX() && obj.getY()
,即使通量中還有其他元素與該條件匹配。 該標准基於mono的響應,這是一個反應性mongo db調用,而來自發出的磁通元素的事實很少。
方法1:
Mono<MyObj2> filteredInfo = mono1.flatMapMany(myObj1 ->
availabilityInfo.filter(myObj1 -> myObj1.getX() && myObj2.getY()).take(1)).single();
方式2:
Mono<MyObj2> filteredInfo = availabilityInfo.collectList().zipWith(mono1).flatMap(tuple -> {
List<MyObj2> list = tuple.getT1();
MyObj1 myObj1 = tuple.getT2();
for(MyObj2 myObj2:list){
if(myObj1.getX() && myObj2.getY()){
return Mono.just(myObj2);
}
}
return Mono.empty();
});
flatMapMany
用於通過處理單聲道創建通量。 filter
采用謂詞,該謂詞構成過濾通量的基礎。
例:
Mono<Integer> mono = Mono.just(3);
Flux<Integer> flux = Flux.just(1, 2, 3, 4, 5, 6);
//Way 1
Mono<Integer> res = mono.flatMapMany(i -> flux.filter(j -> j % i == 0).take(1)).single();
res.subscribe(System.out::println);
//Way 2
flux.collectList().zipWith(mono).flatMap(tuple -> {
List<Integer> list = tuple.getT1();
int x = tuple.getT2();
for(int y:list){
if(y%x==0){
return Mono.just(x);
}
}
return Mono.empty();
}).subscribe(System.out::println);
兩種方式都會給我輸出:
3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.