2014-03-28 73 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