Инициализация ArrayList в одну строку - PullRequest
2501 голосов
/ 17 июня 2009

Я хочу создать список опций для целей тестирования. Сначала я сделал это:

ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");

Затем я изменил код следующим образом:

ArrayList<String> places = new ArrayList<String>(
    Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

Есть ли лучший способ сделать это?

Ответы [ 30 ]

8 голосов
/ 28 января 2015

С Eclipse Collections вы можете написать следующее:

List<String> list = Lists.mutable.with("Buenos Aires", "Córdoba", "La Plata");

Вы также можете более точно указать типы и быть изменяемыми или неизменяемыми.

MutableList<String> mList = Lists.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableList<String> iList = Lists.immutable.with("Buenos Aires", "Córdoba", "La Plata");

Вы также можете сделать то же самое с наборами и сумками:

Set<String> set = Sets.mutable.with("Buenos Aires", "Córdoba", "La Plata");
MutableSet<String> mSet = Sets.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet<String> iSet = Sets.immutable.with("Buenos Aires", "Córdoba", "La Plata");

Bag<String> bag = Bags.mutable.with("Buenos Aires", "Córdoba", "La Plata");
MutableBag<String> mBag = Bags.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableBag<String> iBag = Bags.immutable.with("Buenos Aires", "Córdoba", "La Plata");

Примечание: Я являюсь коммиттером для Eclipse Collections.

7 голосов
/ 15 декабря 2014

О самом компактном способе сделать это:

Double array[] = { 1.0, 2.0, 3.0};
List<Double> list = Arrays.asList(array);
7 голосов
/ 01 марта 2017

Вот еще один способ:

List<String> values = Stream.of("One", "Two").collect(Collectors.toList());
7 голосов
/ 21 сентября 2013

Просто используйте приведенный ниже код следующим образом.

List<String> list = new ArrayList<String>() {{
            add("A");
            add("B");
            add("C");
}};
6 голосов
/ 06 июня 2013

(должен быть комментарий, но слишком длинный, поэтому новый ответ). Как уже упоминалось, метод Arrays.asList имеет фиксированный размер, но это не единственная проблема с ним. Он также не очень хорошо обрабатывает наследование. Например, предположим, что у вас есть следующее:

class A{}
class B extends A{}

public List<A> getAList(){
    return Arrays.asList(new B());
}

Вышеприведенное приводит к ошибке компилятора, потому что List<B> (то есть то, что возвращается Arrays.asList) не является подклассом List<A>, даже если вы можете добавить объекты типа B к объекту List<A> , Чтобы обойти это, вам нужно сделать что-то вроде:

new ArrayList<A>(Arrays.<A>asList(b1, b2, b3))

Это, наверное, лучший способ сделать это, особенно. если вам нужен неограниченный список или вам нужно использовать наследование.

6 голосов
/ 28 марта 2017

Вы можете использовать следующие утверждения:

Фрагмент кода:

String [] arr = {"Sharlock", "Homes", "Watson"};

List<String> names = Arrays.asList(arr);
5 голосов
/ 06 декабря 2016

Java 9 имеет следующий метод для создания неизменяемого списка:

List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");

, который легко адаптируется для создания изменяемого списка, если требуется:

List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));

Подобные методы доступны для Set и Map.

5 голосов
/ 17 июня 2013

Как Том сказал :

List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

Но так как вы жаловались на то, что хотите ArrayList, вы должны сначала знать, что ArrayList является подклассом List, и вы можете просто добавить эту строку:

ArrayList<String> myPlaces = new ArrayList(places);

Хотя это может заставить вас жаловаться на «производительность».

В этом случае для меня не имеет смысла, почему, поскольку ваш список предопределен, он не был определен как массив (так как размер известен во время инициализации). И если это вариант для вас:

String[] places = {"Buenos Aires", "Córdoba", "La Plata"};

Если вам не нужны незначительные различия в производительности, вы также можете очень просто скопировать массив в ArrayList:

ArrayList<String> myPlaces = new ArrayList(Arrays.asList(places));

Хорошо, но в будущем вам понадобится немного больше, чем просто название места, вам также понадобится код страны. Предполагая, что это все еще предопределенный список, который никогда не изменится во время выполнения, тогда уместно использовать набор enum, который потребует повторной компиляции, если список потребуется изменить в будущем.

enum Places {BUENOS_AIRES, CORDOBA, LA_PLATA}

станет:

enum Places {
    BUENOS_AIRES("Buenos Aires",123),
    CORDOBA("Córdoba",456),
    LA_PLATA("La Plata",789);

    String name;
    int code;
    Places(String name, int code) {
      this.name=name;
      this.code=code;
    }
}

У перечислений есть статический метод values, который возвращает массив, содержащий все значения перечисления в порядке их объявления, например ::

for (Places p:Places.values()) {
    System.out.printf("The place %s has code %d%n",
                  p.name, p.code);
}

В таком случае, я думаю, вам не нужен ваш ArrayList.

P.S. Рандяа продемонстрировал еще один замечательный способ с использованием метода статической утилиты Collections.addAll .

4 голосов
/ 25 июня 2017

Вы можете использовать StickyList из Cactoos :

List<String> names = new StickyList<>(
  "Scott Fitzgerald", "Fyodor Dostoyevsky"
);
4 голосов
/ 22 июня 2014
List<String> names = Arrays.asList("2","@2234","21","11");
...