Lists.newArrayList против нового ArrayList
Какова наилучшая конструкция для создания List
строк? Это Lists.newArrayList()
(от guava) или new ArrayList()
?
это просто личное предпочтение?
или это просто тип типичного вывода типа?
или есть теоретическая или практическая ценность при использовании List.newArrayList()?
Ответы
Ответ 1
Конструктор guava сохраняет типичные аргументы несколько раз. Для сравнения:
List<Foo<Bar, Baz>> list = Lists.newArrayList();
List<Foo<Bar, Baz>> list = new ArrayList<Foo<Bar, Baz>>();
В Java 7 это немного устарело, потому что у вас есть оператор бриллианта:
List<Foo<Bar, Baz>> list = new ArrayList<>();
Ответ 2
Из Источник Guava:
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}
Все, что делает, допускает вывод типа - без разницы во время выполнения.
Ответ 3
Добавить одну точку, перегрузка версия List.newArrayList() более полезна:
-
Lists.newArrayList(E... elements)
-
Lists.newArrayList(Iterable<? extends E> elements)
-
Lists.newArrayList(Iterator<? extends E> elements)
предоставляют более полезные функции, чем new ArrayList()
.
Например: new ArrayList()
не может делать:
Lists.newArrayList("a","b");
Lists.newArrayList(anIterable);
Ответ 4
Вот что делает List.newArrayList:
@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}
Таким образом, эти два являются в основном одинаковыми, поскольку использование newArrayList имеет то преимущество, что не нужно дублировать общий тип. Это очень полезно для сложных дженериков:
List<Map<X,List<Y>> list = new ArrayList<Map<X,List<Y>>();
List<Map<X,List<Y>> list = Lists.newArrayList();
Ответ 5
Как объяснено здесь, основные мотивы использования Lists
, Sets
и т.д. - улучшить читаемость/дублирование в вашем коде, и для вывода типа.
Ответ 6
Как уже отмечалось, Java 7 делает это устаревшим, но я использую метод factory, потому что он меняет тип списка, набор, карту или что-то еще проще.
Ответ 7
Java 8 для перегруженных конструкторов.
Если вы хотите использовать перегруженные конструкторы из Guava, я бы порекомендовал другой способ использования Java 8 Stream Builder.
List<String> listTest = Stream.<String>builder.add("Hello").add("My Name").add("Blah").build().collect(Collectors.toList());