2014-03-28 40 views
0

我想要某种通用方法来允许我基于使用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)方法吗?

感谢, 斯图尔特

+1

你需要什么样的上下文?你真的有理由相信这会给业绩带来好处吗? –

+0

是的。在我们的EJB应用程序中,我们有场景可以节省时间,而不是加载所有查询结果,只会加载所需的结果。有些查询可能会返回数百个本地人,但我们可能只对前三或四个感兴趣。 – mrswadge

+1

一般来说,你最好把它作为Iterable而不是Collection来避免大部分的混乱。 –

回答

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(); 
} 
+0

谢谢,我已经忘记了这一点。 – mrswadge