библиотеки guava: список с n экземплярами - PullRequest
4 голосов
/ 21 декабря 2010

Класс Java Collections имеет следующий метод:

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

Мне нужен похожий метод, но немного более общий, который обеспечивает n экземпляров данного класса.Что-то вроде:

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

В частности, если supplier равно Supplier.ofInstance(o), мы получаем то же поведение, что и метод nCopies().Есть ли такой метод где-нибудь в API Guava?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 21 декабря 2010

Нет, нет, и любая эквивалентная конструкция (которая просто хранит int n и поставщика и вызывает поставщика для каждого get) кажется ужасной идеей. Тем не менее, очевидно, вы просто хотите прочитать n объектов из Supplier и сохранить их в списке. В этом случае ответ Шона, вероятно, лучший.

Просто для забавы, вот еще один способ создать ImmutableList размера n, вызвав Supplier n раз (transform, limit и cycle все из Iterables):

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

Я ... не рекомендую это по сравнению с простой реализацией цикла (в основном для удобства чтения).

2 голосов
/ 08 июня 2016

Как и многие другие идиомы, 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());
2 голосов
/ 21 декабря 2010

Нет, но это достаточно просто реализовать:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...