4

JavaCollectionsクラスには次のメソッドがあります。

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

同様のメソッドが必要ですが、特定のクラスのnインスタンスを提供する、もう少し一般的なメソッドが必要です。何かのようなもの:

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

特に、supplierisSupplier.ofInstance(o)の場合、メソッドと同じ動作が得られnCopies()ます。Guava API のどこかにそのようなメソッドはありますか?

ありがとうございました。

4

3 に答える 3

4

ありません。同等の構成(int nとサプライヤを格納し、それぞれのサプライヤを呼び出すget)はひどい考えのようです。Supplierとは言うものの、どうやらあなたはaからn個のオブジェクトを読み取り、それらをリストに保存したいだけなのです。その場合、ショーンの答えはおそらく最良です。

ただし、楽しみのために、 n回(、およびすべてから)ImmutableListを呼び出すことでサイズnのを作成できる別の方法を次に示します。SuppliertransformlimitcycleIterables

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 に答える