我想要某種通用方法來允許我基於使用java.util.Collection.get(int)方法延遲加載集合內容。我在Guava中找到了Supplier接口,這看起來像是一種很好的延遲加載方式,但是如何使加載在Java集合中不可見是我所苦苦掙扎的。使用供應商接口的番石榴懶惰集合
下面是一個迭代通過迭代器的示例延遲加載方法。
class MySupplier<T> implements Supplier<T> {
private T s;
public MySupplier(T s) {
this.s = s;
}
public T get() {
System.out.println(String.format("Lazy loading '%s'", s));
return s;
}
}
public void lazyLoad() {
List<MySupplier<String>> list = Lists.newArrayList(new MySupplier<String>("a"), new MySupplier<String>("a"), new MySupplier<String>("b"), new MySupplier<String>("c"), new MySupplier<String>("d"));
for (Iterator<MySupplier<String>> i = list.iterator(); i.hasNext();) {
System.out.println(i.next().get());
}
}
我想避免使用Supplier.get()方法,如果我能幫助它,而是有當Collection.get(INT)被稱爲集合包裝照顧對我來說。我希望在一個簡單的方法調用中實現這一點,我在下面調用了makeLazy(Collection)
。
public void lazyLoad_desired() {
List<String> list = makeLazy(
Lists.newArrayList(new MySupplier<String>("a"), new MySupplier<String>("a"), new MySupplier<String>("b"), new MySupplier<String>("c"), new MySupplier<String>("d"))
);
for (Iterator<String> i = list.iterator(); i.hasNext();) {
String s = i.next();
System.out.println(s);
}
}
我意識到我需要重寫集合,但我在這方面的知識有一些差距。有人可以給我一些提示和提示,我需要做什麼來實現makeLazy(Collection)方法嗎?
感謝, 斯圖爾特
你需要什麼樣的上下文?你真的有理由相信這會給業績帶來好處嗎? –
是的。在我們的EJB應用程序中,我們有場景可以節省時間,而不是加載所有查詢結果,只會加載所需的結果。有些查詢可能會返回數百個本地人,但我們可能只對前三或四個感興趣。 – mrswadge
一般來說,你最好把它作爲Iterable而不是Collection來避免大部分的混亂。 –