Diğerlerinin söylediği gibi, tekrarlanabilir bir şekilde birden çok kez çağrılabilir ve her çağrıda yeni bir Yineleyici döndürülebilir; bir yineleyici sadece bir kez kullanılır. Yani birbiriyle ilişkilidir, ancak farklı amaçlara hizmet ederler. Ancak, sinir bozucu bir şekilde, "kompakt" yöntemi yalnızca bir yinelenebilir ile çalışır.
Aşağıda açıklayacağım şey, her iki dünyanın da en iyisine sahip olmanın bir yoludur - temeldeki veri dizisi bir kerelik olsa bile Yinelenebilir (güzel sözdizimi için) döndürme.
İşin püf noktası, gerçekten çalışmayı tetikleyen Yinelenebilir'in anonim bir uygulamasını döndürmektir. Bu nedenle, bir defalık bir dizi oluşturan işi yapmak ve ardından bir Yineleyici döndürmek yerine, her erişildiğinde işi yeniden yineleyen bir Yinelenebilir döndürürsünüz. Bu savurgan görünebilir, ancak çoğu zaman yinelenebilir bir şekilde yine de bir kez çağırırsınız ve birden çok kez çağırsanız bile, hala makul anlambilime sahiptir (bir Yineleyiciyi "Yinelenebilir" gibi görünen basit bir sargının aksine, t iki kez kullanılırsa başarısız olur).
Örneğin, bir veritabanından bir dizi nesne sağlayan bir DAO'm var ve buna bir yineleyici aracılığıyla erişim sağlamak istiyorum (örneğin, gerekli değilse, bellekteki tüm nesneleri oluşturmaktan kaçınmak için). Şimdi sadece bir yineleyici döndürebilir, ancak bu bir döngüde döndürülen değeri çirkin kullanarak yapar. Bunun yerine her şeyi yinelenebilir bir anon'a sararım:
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();
}
};
}
}
bu daha sonra şu şekilde kodda kullanılabilir:
class DaoUser {
private MetricDao dao;
for (Metric existing : dao.loadAll()) {
// do stuff here...
}
}
bu da artımlı bellek kullanımını korurken kompakt for loop'u kullanmama izin veriyor.
Bu yaklaşım "tembel" dir - iş tekrarlanabilir istendiğinde değil, ancak daha sonra içerik yinelendiğinde yapılır - ve bunun sonuçlarının farkında olmanız gerekir. Veritabanı işlemindeki sonuçlar üzerinden yineleme anlamına gelen bir DAO örneğinde.
Yani çeşitli uyarılar var, ancak bu birçok durumda hala yararlı bir deyim olabilir.