2016-04-23 19 views
8

जब हम स्काला में भविष्य का उपयोग करते हैं तो मैं पूर्ण और पूर्वानुमान के बीच का अंतर सोचता हूं।स्कैला में भविष्य के लिए पूर्ण और foreach के बीच क्या अंतर है?

f onComplete (_ => doSomething(_))

और

f foreach (_ => doSomething(_))

  1. समान परिणाम प्राप्त कोड नेतृत्व की ऊपर लाइनों है?

  2. यदि मैं करना चाहता हूं तो भविष्य के साथ कुछ पूरा होने के बाद ही कुछ। मुझे क्या करना चाहिए? मैं इस तरह isCompleted का उपयोग करना चाहिए:

    if(f.isCompleted) f onComplete (_ => doSomething(_))

तुम लोग एक बहुत धन्यवाद

उत्तर

13

मुख्य अंतर यह है onComplete कॉलबैक कहा जाता हो जाता है, भले ही भविष्य एक विफलता साथ पूरा करता है, जबकि foreach (और onSuccess) कार्यों को केवल सफल परिणाम के मामले में बुलाया जाता है।

वास्तव में, onComplete के पैरामीटर एक समारोह Try[T] => U है: समारोह आप पास या तर्क के रूप में एक Success[T] साथ बुलाया जाएगा यदि भविष्य सफल हुआ एक Failure साथ अगर वहाँ एक अपवाद था:

val f = Future { ??? } // this future completes with a failure 

// foreach only calls the callback if the future is successful 
f.foreach(_ => thisWillNeverExecute()) 

// This will print "future failed" after the future completes 
f.onComplete { 
    case Success(_) => println("future completed successfully") 
    case Failure(e) => println("future failed") 
} 

साथ ही, आपको उल्लिखित विधियों को कॉल करने के लिए कुछ भी जांचने की आवश्यकता नहीं है: onComplete/onSuccess/onFailure/foreach सभी कॉलबैक को शेड्यूल करते हैं जिसे अंतर्निहित ExecutionContext पर कॉल किया जाता है, केवल आपके पास भविष्य में पूरा होने पर ही होता है।

isCompleted झूठ बोलने पर भी आप उन्हें कॉल कर सकते हैं, भले ही भविष्य को सफलतापूर्वक पूरा हो या विफल हो जाए, जिस पर आपने चुना था।

के अपने हस्ताक्षर पर एक नजर है:

def onComplete[U](@f: Try[T] => U)(implicit executor: ExecutionContext): Unit 
  • onComplete लेता है एक Try[T] => U समारोह: इस समारोह जब भविष्य पूरा करता implicit executor पर निष्पादित किया जाएगा। तर्क या तो एक Success[T] हो सकता है अगर भविष्य सफल हुआ या एक Failure अगर भविष्य में विफल रहा है

def onFailure[U](pf: PartialFunction[Throwable, U])(implicit executor: ExecutionContext): Unit 
  • onFailure पैरामीटर PartialFunction कि केवल implicit executor पर निष्पादित किया जाता है, तो भविष्य में विफल रहता है है Throwable के साथ pf परिभाषित किया गया है। यह मूल रूप से कुछ Failure एस से मिलान करने पर कॉल करने जैसा ही है, और वास्तव में यह मानक लाइब्रेरी में बिल्कुल लागू किया गया है।

def onSuccess[U](pf: PartialFunction[T, U])(implicit executor: ExecutionContext): Unit 
  • onSuccess पैरामीटर, संतुलित onFailure के लिए, एक PartialFunction कि केवल implicit executor पर निष्पादित किया जाता है, तो भविष्य को सफलतापूर्वक पूरा और आपूर्ति PartialFunction मूल्य के लिए परिभाषित किया गया है है।

def foreach[U](f: T => U)(implicit executor: ExecutionContext): Unit 
  • foreach मूल रूप से onSuccess रूप में ही है, लेकिन यह एक कुल समारोह लेता है। इसका मतलब है कि f हमेशा क्रियान्वित किया जाता है, तो भविष्य को सफलतापूर्वक पूरा

N.B .: 'onSuccess' और 'onFailure' 2.12 में बहिष्कृत कर दिया करने के लिए जा रहे हैं। मेरा सुझाव है कि

+0

परिवर्तनों से आप कैसे प्रभावित होंगे, यह जानने के लिए this series of posts by Viktor Klang पढ़ें, धन्यवाद, आपका उत्तर बहुत विस्तृत है। मैंने उससे बहुत कुछ सीखा। तो, इसका मतलब है कि 'foreach' 'success' के बराबर है। क्या वह सही है? – hminle

+1

'foreach' 'onSuccess' का" कुल "संस्करण है। यदि आप कुल कार्य को 'ऑनसेफ' पर पास करते हैं तो वे लगभग बराबर हैं। दोनों 'foreach' और' onSuccess' 'को' पूर्ण 'के संदर्भ में लागू किया गया है, लेकिन यह 2.12 –

+0

में बदल जाएगा धन्यवाद, मुझे मिल गया – hminle

संबंधित मुद्दे