Java guava库:包含n个实例的列表

Java guava库:包含n个实例的列表,java,guava,utility-method,Java,Guava,Utility Method,JavaCollections类具有以下方法: static <T> List<T> nCopies(int n, T o) 静态列表nCopies(int n,to) 我需要一个类似的方法,但稍微通用一些,它提供给定类的n个实例。比如: static <T> List<T> nInstances(int n, Supplier<T> supplier) 静态列表n实例(int n,供应商) 特别是,如果supplier是sup

Java
Collections
类具有以下方法:

static <T> List<T> nCopies(int n, T o)
静态列表nCopies(int n,to)
我需要一个类似的方法,但稍微通用一些,它提供给定类的n个实例。比如:

static <T> List<T> nInstances(int n, Supplier<T> supplier)
静态列表n实例(int n,供应商)
特别是,如果
supplier
supplier.ofInstance(o)
,我们将得到与
nCopies()
方法相同的行为。在番石榴API中有这样的方法吗


谢谢。

没有,任何等效的构造(只存储int n和供应商,并为每个
get
调用供应商)似乎都是个糟糕的主意。也就是说,显然您只想从
供应商
读取n个对象,并将它们存储在列表中。在这种情况下,肖恩的答案可能是最好的

不过,为了好玩,这里有另一种方法可以创建大小为n的
不可变列表
,方法是通过调用
供应商
n次(
转换
限制
循环
,所有这些都来自
Iterables
):

公共静态不可变列表n实例(int n,供应商){
返回ImmutableList.copyOf(转换(
极限(循环(supplier),n),Suppliers.supplierFunction());
}

我呃。。。不过,与直接的循环实现相比,不建议使用此方法(主要是出于可读性原因)。

不,但实现起来非常简单:

public static <T> List<T> nInstances(int n, Supplier<T> supplier){
    List<T> list = Lists.newArrayListWithCapacity(n);
    for(int i = 0; i < n; i++){
        list.add(supplier.get());
    }
    return list;
}
公共静态列表n实例(int n,供应商){
List List=Lists.newArrayListWithCapacity(n);
对于(int i=0;i
与许多其他习惯用法一样,Java8最终提供了一个简短而甜美的版本,不需要任何外部库。现在,您可以使用。例如,对于
n
Foo
实例:

Streams.generate(Foo::new).limit(n)...
根据您想要创建列表的方式,您将以不同的方式完成该行。例如,对于
不可变列表

ImmutableList.copyOf(Streams.generate(Foo::new).limit(n).iterator());

我认为这并不等同于
Collections.nCopies
,因为它返回的
列表使用最小的存储空间(仅一个int和一个引用)。这只是将供应商返回的所有值转储到
数组列表中。事实上,我已经完全实现了你的建议。@ColinD不,显然它不是等价物(而且它绝对不值得食用番石榴)。但这是OP想要的是的,虽然他不太清楚自己到底想要什么。然而,我越想它,我就越觉得类似于
Collections.nCopies
的东西,为每个
get
调用
供应商将是一个可怕的想法,除非它缓存每个值。。。所以这可能是最好的。下面是另一个有趣的单行方法:转换(限制(循环(1),拷贝数),函数。对于供应商(供应商))
ImmutableList.copyOf(Streams.generate(Foo::new).limit(n).iterator());