Какой самый короткий способ инициализировать список строк в Java? - PullRequest
51 голосов
/ 29 июня 2011

Я ищу кратчайший способ (в коде) инициализировать список строк и массив строк, т.е. список / массив, содержащий строковые элементы "s1", "s2", "s3".

Ответы [ 7 ]

94 голосов
/ 29 июня 2011

Существуют различные варианты. Лично мне нравится использовать Гуава :

List<String> strings = Lists.newArrayList("s1", "s2", "s3");

(Guava - это библиотека, которую стоит иметь в любом случае, конечно:)

Используя только JDK, вы можете использовать:

List<String> strings = Arrays.asList("s1", "s2", "s3");

Обратите внимание, что это вернет ArrayList, но это , а не , как обычно java.util.ArrayList - это внутренняя переменная, но фиксированного размера.

Лично я предпочитаю версию Guava, так как она проясняет, что происходит (реализация списка, которая будет возвращена). Также все еще ясно, что происходит, если вы статически импортируете метод:

// import static com.google.common.collect.Lists.newArrayList;
List<String> strings = newArrayList("s1", "s2", "s3");

... тогда как при статическом импорте asList это выглядит немного страннее.

Еще один вариант Guava, если вы не хотите, чтобы список изменяемых в любом случае:

ImmutableList<String> strings = ImmutableList.of("s1", "s2", "s3");

Обычно я хочу, чтобы или имели полностью изменяемый список (в этом случае Lists.newArrayList лучше) или полностью неизменяемый список (в этом случае ImmutableList.of лучше) , Я редко хочу список изменяемых, но фиксированных размеров.

24 голосов
/ 29 июня 2011

Java 9 +

Java 9 представляет удобный метод List.of, используемый следующим образом:

List<String> l = List.of("s1", "s2", "s3");

Java 8 и старше

Вот несколько альтернатив:

// Short, but the resulting list is fixed size.
List<String> list1 = Arrays.asList("s1", "s2", "s3");

// Similar to above, but the resulting list can grow.
List<String> list2 = new ArrayList<>(Arrays.asList("s1", "s2", "s3"));

// Using initialization block. Useful if you need to "compute" the strings.
List<String> list3 = new ArrayList<String>() {{
    add("s1");
    add("s2");
    add("s3");
}};

Когда дело доходит до массивов, вы можете инициализировать его в точке объявления следующим образом:

String[] arr = { "s1", "s2", "s3" };

Если вам нужно повторно инициализировать или создать его без сохранения в переменной, выdo

new String[] { "s1", "s2", "s3" }

Если строковые константы могут, хотя, это будет выглядеть как

String[] arr = { "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
                 "s11", "s12", "s13" };

В них я обычно предпочитаю писать

String[] arr = "s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13".split(",");
14 голосов
/ 29 июня 2011
List<String> stringList = Arrays.asList("s1", "s2", "s3");

Все эти объекты существуют в JDK.

PS: Как указано aioobe , это делает список фиксированного размера.

3 голосов
/ 29 июня 2011

Вы можете использовать класс Arrays в стандартном Java API: http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T...)

List<String> strings = Arrays.asList("s1", "s2", "s3");

Имейте в виду, что список результатов имеет фиксированный размер (вы не можете добавить к нему).

2 голосов
/ 29 января 2017

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

List<String> list = Lists.mutable.with("s1", "s2", "s3");

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

MutableList<String> mList = Lists.mutable.with("s1", "s2", "s3");
ImmutableList<String> iList = Lists.immutable.with("s1", "s2", "s3");

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

Set<String> set = Sets.mutable.with("s1", "s2", "s3");
MutableSet<String> mSet = Sets.mutable.with("s1", "s2", "s3");
ImmutableSet<String> iSet = Sets.immutable.with("s1", "s2", "s3");

Bag<String> bag = Bags.mutable.with("s1", "s2", "s3");
MutableBag<String> mBag = Bags.mutable.with("s1", "s2", "s3");
ImmutableBag<String> iBag = Bags.immutable.with("s1", "s2", "s3");

Map<String, String> map = 
    Maps.mutable.with("s1", "s1", "s2", "s2", "s3", "s3");
MutableMap<String, String> mMap = 
    Maps.mutable.with("s1", "s1", "s2", "s2", "s3", "s3");
ImmutableMap<String, String> iMap = 
    Maps.immutable.with("s1", "s1", "s2", "s2", "s3", "s3");

Есть также фабрики для SortedSets, SortedBags и SortedMaps.

SortedSet<String> sortedSet = SortedSets.mutable.with("s1", "s2", "s3");
MutableSortedSet<String> mSortedSet = SortedSets.mutable.with("s1", "s2", "s3");
ImmutableSortedSet<String> iSortedSet = SortedSets.immutable.with("s1", "s2", "s3");

SortedBag<String> sortedBag = SortedBags.mutable.with("s1", "s2", "s3");
MutableSortedBag<String> mSortedBag = SortedBags.mutable.with("s1", "s2", "s3");
ImmutableSortedBag<String> iSortedBag = SortedBags.immutable.with("s1", "s2", "s3");

SortedMap<String, String> sortedMap =
        SortedMaps.mutable.with("s1", "s1", "s2", "s2", "s3","s3");
MutableSortedMap<String, String> mSortedMap =
        SortedMaps.mutable.with("s1", "s1", "s2", "s2", "s3","s3");
ImmutableSortedMap<String, String> iSortedMap =
        SortedMaps.immutable.with("s1", "s1", "s2", "s2", "s3","s3");

Примечание: Я коммиттер Eclipse Collections.

1 голос
/ 08 мая 2018

JDK2

List<String> list = Arrays.asList("one", "two", "three");

JDK7

//diamond operator
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");

JDK8

List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());

JDK9

List<String> list = List.of("one", "two", "three");

Кроме того, есть множество других способов, предоставляемых другими библиотеками, такими как Guava.

0 голосов
/ 29 января 2017

Я не знаком с Guava, но почти все решения, упомянутые в других ответах и ​​использующие JDK, имеют некоторые недостатки:

  1. Метод Arrays.asList возвращает список фиксированного размера.

  2. {{Двойная инициализация}}, как известно, создают беспорядок в пути к классам и замедляют выполнение . Также требуется одна строка кода на элемент.

  3. Java 9 : метод статической фабрики List.of возвращает структурно неизменный список. Более того, List.of является на основе значения , и, следовательно, его контракт не гарантирует, что он будет возвращать новый объект каждый раз.


Здесь представлен однострочник Java 8 для сбора нескольких отдельных объектов в ArrayList или любую коллекцию в этом отношении.

List<String> list = Stream.of("s1", "s2", "s3").collect(Collectors.toCollection(ArrayList::new));

Примечание : решение aioobe о копировании временной коллекции (new ArrayList<>(Arrays.asList("s1", "s2", "s3"))) также превосходно.

...