मेरे पास 3 CompletableFutures सभी 3 अलग-अलग डेटा प्रकार लौट रहे हैं।जावा 8 कॉम्प्लेबल फ्यूचर्स सभी अलग-अलग डेटा प्रकारों के
मैं परिणाम ऑब्जेक्ट बनाना चाहता हूं जो कि सभी 3 वायदा द्वारा किए गए परिणाम की संरचना है।
तो मेरी वर्तमान कार्यशील कोड इस तरह दिखता है:
public ClassD getResultClassD() {
ClassD resultClass = new ClassD();
CompletableFuture<ClassA> classAFuture = CompletableFuture.supplyAsync(() -> service.getClassA());
CompletableFuture<ClassB> classBFuture = CompletableFuture.supplyAsync(() -> service.getClassB());
CompletableFuture<ClassC> classCFuture = CompletableFuture.supplyAsync(() -> service.getClassC());
CompletableFuture.allOf(classAFuture, classBFuture, classCFuture)
.thenAcceptAsync(it -> {
ClassA classA = classAFuture.join();
if (classA != null) {
resultClass.setClassA(classA);
}
ClassB classB = classBFuture.join();
if (classB != null) {
resultClass.setClassB(classB);
}
ClassC classC = classCFuture.join();
if (classC != null) {
resultClass.setClassC(classC);
}
});
return resultClass;
}
मेरे प्रश्न हैं:
यहाँ मेरी धारणा है कि के बाद से मैं
allOf
औरthenAcceptAsync
का उपयोग कर रहा हूँ कि इस कॉल गैर अवरुद्ध हो जाएगा। क्या मेरी समझ सही है?क्या यह विभिन्न परिणाम प्रकारों को वापस करने वाले कई वायदा से निपटने का सही तरीका है?
thenAcceptAsync
के भीतरClassD
ऑब्जेक्ट का निर्माण करने का अधिकार है?- क्या यह
join
याgetNow
विधि का उपयोग करने के लिए उपयुक्त है AcceptAsync lambda में?
विस्तृत उत्तर के लिए धन्यवाद। आपके उत्तर का मेरा एकमात्र अनुवर्ती यह है कि तब एपलीएसिंक के पास रिटर्नटेबल फ्यूचर का रिटर्न प्रकार है, यह कैसे काम करेगा और इस विधि को कैसे लागू करेगा और परिणाम –
नहीं होगा, नहीं, यह 'allOf' का रिटर्न प्रकार है जो 'CompletableFuture' , यही कारण है कि 'passApplyAsync' को पारित किया गया कार्य इनपुट के रूप में 'शून्य' प्राप्त करता है ('डमी'> के बजाय उपरोक्त 'डमी' पैरामीटर, आप '(शून्य डमी) -> 'भी लिख सकते हैं। फिर, फ़ंक्शन 'शून्य' इनपुट (वास्तव में इसे अनदेखा करके) को 'क्लासडी' परिणाम में अनुवादित करता है, इसलिए 'thenApplyAsync' का परिणाम' CompletableFuture 'होगा। –
Holger
@ होल्गर मैं आपके लिए एक समान मार्ग पर जा रहा था लेकिन मैं वैकल्पिक कॉल का उपयोग कर रहा था। सेवा कॉल में अनुपयोगी, इसलिए आप 'cCFuture.join()। IfPresent (कक्षा :: SetStuff)' – Ash