2010-12-21 80 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());