我有一個需要在一系列嵌套回圈中的代碼邏輯。這是示例:
String q = null;
for(C c in getC()){
if(Valid(c)){
String Id = c.Id;
List<M> mList = getM(Id);
for(M m in mList){
q = Message.Format("query:{}",m);
List<D> dList = getD(Id, q);
sendDToKafka(dList);
}
}
}
我正在嘗試使用專案反應器將上述邏輯轉換為反應式。我到目前為止的代碼:
Flux.fromIterable(getC())
.map(c -> c.getId)
.doOnNext(cId -> getM(cId))
.map(m -> m.trim())
.doOnNext(m -> getD()) // need to pass in query and Id to getD()
.subscribe();
我面臨的問題很少:
- 如何將 IsValid() 方法合并到查詢中。
- 我需要在兩個地方重用我在第一張地圖上獲得的 cId 值 - .map(c -> c.getId)。如果在下一步中不立即使用,我如何跟蹤該值。
- 有沒有辦法在反應式查詢中形成 q 變數作為 getD() 中的引數傳遞
- 如果代碼是一種有效的方法,我將非常感謝任何反饋。
uj5u.com熱心網友回復:
首先,doOnNext方法是為了副作用而不是為了改變事件流。此外,如果您要將某些內容轉換為回應式,則整個管道需要是非阻塞的,您應該避免呼叫任何阻塞的代碼。如果您有無法更改的阻塞代碼,您可以按照此處的建議進行操作:
對于過濾,您可以在多個地方使用filter和使用cId,或者將它作為元組傳遞給鏈(那里有很多庫),或者您可以為此目的創建自己的類。
uj5u.com熱心網友回復:
- 如何將 IsValid() 方法合并到查詢中。
有一個運算子:
Flux.fromIterable(getC())
.filter(c -> valid(c))
- 我需要在兩個地方重用我在第一張地圖上獲得的 cId 值 - .map(c -> c.getId)。如果在下一步中不立即使用,我如何跟蹤該值。
在特別簡單的情況下,您可以flatmap像這樣簡單地使用嵌套的s:
.flatMap(id ->
Flux.fromIterable(getM(id))
.flatMap(m -> {
String q = Message.Format("query: {}", m);
List<D> dList = getD(id, q);
return sendDToKafka(dList);
})
)
請參閱Java Reactor 中嵌套 flatMap 的好習慣是什么?
- 有沒有辦法在反應式查詢中形成 q 變數作為 getD() 中的引數傳遞
您不能q在流中使用非最終變數。看看AtomicReference<String>。
正如在另一個答案中已經提到的,doOnNext是為了副作用,map是為了將某些東西從一種型別映射到另一種型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/335981.html
