我想要某种通用方法来允许我基于使用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来避免大部分的混乱。 –