2010-12-21 30 views
4

Java的Collections类具有以下方法列表:番石榴库:有n个实例

static <T> List<T> nCopies(int n, T o) 

我需要一个类似的方法,但是稍微更通用的,它提供了一个给定类的ñ实例。喜欢的东西:

static <T> List<T> nInstances(int n, Supplier<T> supplier) 

特别是,如果supplierSupplier.ofInstance(o),我们得到了相同的行为nCopies()方法。在Guava API中是否有这种方法?

谢谢。

回答

2

没有,但它是很容易实现:

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

我不认为能真正被视为等同于`Collections.nCopies`,因为关于区别的是,在`List`返回使用最少的存储(只是一个int和一个参考)。这只是将供应商返回的所有值转储到`ArrayList`中。 – ColinD 2010-12-21 16:58:16

4

没有没有,任何等效结构(即只存储中的int n和供应商,并要求供应商对每一get)似乎是一个可怕的想法。这就是说,显然你只是想读从Supplier n个对象,并将它们存储在列表中。在这种情况下,肖恩的答案可能是最好的。

只是为了好玩,虽然,这里的另一种方式,你可以通过调用Supplier n次(transformlimitcycle全部来自Iterables)创建一个大小为n的ImmutableList

public static <T> ImmutableList<T> nInstances(int n, Supplier<T> supplier) { 
    return ImmutableList.copyOf(transform(
     limit(cycle(supplier), n), Suppliers.<T>supplierFunction())); 
} 

我呃...止跌尽管如此(尽管主要是为了可读性的原因),但我们并不推荐这样做。

+0

这里是另一个有趣的一条线的方法: 变换(极限(周期(1),copyCount),Functions.forSupplier(供应商)) – Spina 2015-02-20 18:56:03

2

像其他许多成语,爪哇8最后用不需要任何外部库一个简短而亲切的版本提供。你现在可以用Streams.generate(Supplier<T> s)来做到这一点。例如,对于Foon实例:

Streams.generate(Foo::new).limit(n)... 

你会取决于你如何想创建列表完成该行关闭以不同的方式。例如,对于一个ImmutableList

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