使用Supplier接口的Guava Lazy Collection

时间:2014-03-28 17:42:52

标签: java collections guava

我想要某种通用方法,允许我根据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 :(得分: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();
}