4

JavaCollections类具有以下方法:

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

我需要一个类似的方法,但更通用,它提供给定类的n 个实例。就像是:

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

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

谢谢你。

4

3 回答 3

4

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

ImmutableList只是为了好玩,这是另一种方法,您可以通过调用Suppliern 次 (transformlimitall cyclefrom )创建大小为 n 的 an Iterables

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

我呃......虽然(主要是出于可读性原因),但我不会推荐这个而不是简单的循环实现。

于 2010-12-21T16:41:37.763 回答
3

像许多其他习惯用法一样,Java 8 最终提供了一个不需要任何外部库的简短而甜蜜的版本。您现在可以使用Streams.generate(Supplier<T> s). 例如,对于以下n实例Foo

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

根据您想要创建列表的方式,您将以不同的方式完成该行。例如,对于ImmutableList

ImmutableList.copyOf(Streams.generate(Foo::new).limit(n).iterator());
于 2016-06-08T01:59:03.183 回答
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;
}
于 2010-12-21T16:48:52.313 回答