Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用供应商界面收集番石榴_Java_Collections_Guava - Fatal编程技术网

Java 使用供应商界面收集番石榴

Java 使用供应商界面收集番石榴,java,collections,guava,Java,Collections,Guava,我希望使用某种通用方法,允许我基于java.util.Collection.get(int)方法延迟加载集合内容。我在Guava中找到了Supplier接口,这看起来是一种很好的延迟加载方式,但是如何在java集合中使加载不可见是我一直在努力解决的问题 下面是一个通过迭代器进行迭代的延迟加载方法示例 class MySupplier<T> implements Supplier<T> { private T s; public MySupplier( T

我希望使用某种通用方法,允许我基于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() );
    }
}
我意识到我需要以某种方式覆盖收藏,但我在这方面的知识有一些差距。有没有人能给我一些提示和技巧,告诉我需要做些什么来实现makeLazy(Collection)方法

谢谢,
斯图尔特

基于与我的讨论,我决定采纳他的建议,使用迭代器。下面的解决方案似乎对我有效

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();
}
类MySupplier实现供应商{
私人旅行社;
公共MySupplier(TS){
这个.s=s;
}
公共部门得不到{
System.out.println(String.format(“延迟加载“%s”,s));
返回s;
}
}
公共空间懒散负荷(){
列表列表=列表。newArrayList(新MySupplier(“a”)、新MySupplier(“a”)、新MySupplier(“b”)、新MySupplier(“c”)、新MySupplier(“d”);
for(迭代器i=supplierIterator(list);i.hasNext();){
System.out.println(i.next());
}
}

公共静态迭代器供应商迭代器(收集您需要什么样的上下文?您真的有理由相信这会带来性能优势吗?是的。我们的EJB应用程序中有这样的场景,它可以节省时间,而不是加载所有查询结果,它只加载所需的结果。一些查询可以返回数百个局部变量,但我们可能只感兴趣一般来说,你最好把它作为一个收藏品来做,这样可以避免很多混乱。谢谢,我已经忘记了这个。
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();
}