我想要某种通用方法,允许我根据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)方法的提示和技巧吗?
谢谢, 斯图尔特
答案 0 :(得分:0)
根据与Louis Wasserman的讨论,我决定接受他的建议并使用迭代器。以下解决方案似乎对我有用。
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<String> i = supplierIterator( list ); i.hasNext(); ) {
System.out.println( i.next() );
}
}
public static <T> Iterator<T> supplierIterator( Collection<? extends Supplier<T>> c ) {
Function<Supplier<T>, T> function = Suppliers.supplierFunction();
Iterable<T> iterable = Iterables.transform( c, function );
return iterable.iterator();
}