जैसा कि दूसरों ने कहा है, एक Iterable को कई बार कहा जा सकता है, प्रत्येक कॉल पर एक नया Iterator लौटाता है; Iterator का उपयोग केवल एक बार किया जाता है। इसलिए वे संबंधित हैं, लेकिन विभिन्न उद्देश्यों की सेवा करते हैं। निराशा की बात है, हालांकि, "कॉम्पैक्ट के लिए" विधि केवल चलने के साथ काम करती है।
नीचे मैं जो वर्णन करूंगा, वह दोनों दुनिया में सबसे अच्छा करने का एक तरीका है - डेटा के अंतर्निहित अनुक्रम एक-बंद होने पर भी एक Iterable (अच्छे सिंटैक्स के लिए) वापस करना।
चाल Iterable का एक अनाम कार्यान्वयन वापस करना है जो वास्तव में काम को चालू करता है। इसलिए उस कार्य को करने के बजाय जो एक बार के अनुक्रम को उत्पन्न करता है और फिर उस पर एक Iterator को लौटाता है, आप एक Iterable को लौटाते हैं, जो हर बार एक्सेस होने के बाद काम को फिर से करता है। यह बेकार लग सकता है, लेकिन अक्सर आप केवल Iterable को एक बार भी कॉल करेंगे, और भले ही आप इसे कई बार कॉल करते हों, फिर भी इसका उचित अर्थ है टी विफल यदि दो बार इस्तेमाल किया जाता है)।
उदाहरण के लिए, मान लें कि मेरे पास एक डीएओ है जो एक डेटाबेस से वस्तुओं की एक श्रृंखला प्रदान करता है, और मैं एक इट्रेटर के माध्यम से उस तक पहुंच प्रदान करना चाहता हूं (उदाहरण के लिए स्मृति में सभी वस्तुओं को बनाने से बचने के लिए यदि उनकी आवश्यकता नहीं है)। अब मैं सिर्फ एक पुनरावृत्त लौटा सकता था, लेकिन यह एक पाश में लौटे मूल्य का उपयोग करता है। इसलिए इसके बजाय मैं सब कुछ एनोन में लपेटता हूं:
class MetricDao {
...
/**
* @return All known metrics.
*/
public final Iterable<Metric> loadAll() {
return new Iterable<Metric>() {
@Override
public Iterator<Metric> iterator() {
return sessionFactory.getCurrentSession()
.createQuery("from Metric as metric")
.iterate();
}
};
}
}
यह तो इस तरह कोड में इस्तेमाल किया जा सकता है:
class DaoUser {
private MetricDao dao;
for (Metric existing : dao.loadAll()) {
// do stuff here...
}
}
जो मुझे वृद्धिशील मेमोरी का उपयोग करते हुए लूप के लिए कॉम्पैक्ट का उपयोग करने देता है।
यह दृष्टिकोण "आलसी" है - जब Iterable का अनुरोध किया जाता है, तो काम नहीं किया जाता है, लेकिन बाद में जब सामग्री को पुनरावृत्त किया जाता है - और आपको इसके परिणामों के बारे में पता होना चाहिए। एक DAO के साथ उदाहरण में जो डेटाबेस लेनदेन के भीतर परिणामों पर पुनरावृत्ति करता है।
इसलिए विभिन्न कैविटीज़ हैं, लेकिन यह अभी भी कई मामलों में एक उपयोगी मुहावरा हो सकता है।