যেমনটি অন্যরা বলেছেন, একটি আইট্রেবলকে একাধিকবার বলা যেতে পারে, প্রতিটি কলটিতে একটি নতুন আইট্রেটারকে ফিরিয়ে দেওয়া; একটি Iterator মাত্র একবার ব্যবহার করা হয়। সুতরাং তারা সম্পর্কিত, কিন্তু বিভিন্ন উদ্দেশ্যে পরিবেশন। হতাশাজনকভাবে, তবে, "কমপ্যাক্ট ফর" পদ্ধতিটি কেবল পুনরাবৃত্তির সাথে কাজ করে।
আমি নীচে যা বর্ণনা করব তা হ'ল উভয় দুনিয়ার সেরা থাকার এক উপায় - তথ্যের অন্তর্নিহিত ক্রমটি এক-অফ থাকা সত্ত্বেও একটি আইটেবল (ভাল সিনট্যাক্সের জন্য) ফেরত দেওয়া।
কৌশলটি হ'ল আইটেবলের একটি বেনামে বাস্তবায়ন ফিরিয়ে দেওয়া যা আসলে কাজটি ট্রিগার করে। সুতরাং সেই কাজটি না করে যা এক-অফ সিকোয়েন্স তৈরি করে এবং তারপরে একটি আইট্রেটারকে ফিরিয়ে দেয়, আপনি একটি আইটেবল ফিরিয়ে দেন যা প্রতিটি সময় এটি অ্যাক্সেস করা হয়, কাজটি আবার করে দেয়। এটি আপত্তিজনক বলে মনে হতে পারে তবে প্রায়শই আপনি কেবল একবারেই Iteable কল করবেন এবং আপনি এটি একাধিকবার কল করলেও এর যুক্তিসঙ্গত শব্দার্থবিজ্ঞান রয়েছে (একটি সাধারণ মোড়কের বিপরীতে যা কোনও আইট্রেটারকে "স্বাদযুক্ত" দেখতে পছন্দ করে, এটি জিতেছে ' টি ব্যর্থ হলে দুবার ব্যবহার করুন)।
উদাহরণস্বরূপ, বলুন আমার কাছে একটি ডিএও আছে যা একটি ডাটাবেস থেকে বিভিন্ন সিরিজের অবজেক্ট সরবরাহ করে এবং আমি একটি পুনরুক্তির মাধ্যমে এটিতে অ্যাক্সেস সরবরাহ করতে চাই (উদাহরণস্বরূপ, যদি প্রয়োজন না হয় তবে মেমরিতে সমস্ত বস্তু তৈরি করা এড়াতে)। এখন আমি কেবল একটি পুনরাবৃত্তিকে ফিরিয়ে দিতে পারি, তবে এটি একটি লুপকে কুৎসিত করে ফেরত মানটি ব্যবহার করে। সুতরাং পরিবর্তে আমি সমস্ত anteable মধ্যে মোড়ানো
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...
}
}
যা আমাকে ক্রমবর্ধমান মেমরির ব্যবহারের সময় লুপের জন্য কমপ্যাক্ট ব্যবহার করতে দেয়।
এই পদ্ধতিরটি "অলস" - ইটারেবলের অনুরোধ করা হলে কাজটি করা হয় না, তবে কেবল তখনই যখন সামগ্রীগুলি পুনরাবৃত্তি হয় - এবং আপনাকে এর পরিণতি সম্পর্কে সচেতন হতে হবে। উদাহরণস্বরূপ একটি ডিএওর সাথে এর অর্থ ডাটাবেস লেনদেনের মধ্যে ফলাফলগুলি পুনরাবৃত্তি করা।
সুতরাং বিভিন্ন ক্যাভেট রয়েছে, তবে এটি এখনও অনেক ক্ষেত্রে কার্যকর উপাসনা হতে পারে।