Подтвердить что ты не робот

Каков самый короткий способ инициализировать список строк в java?

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

4b9b3361

Ответ 1

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

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 лучше). Редко, что мне действительно нужен список с изменяемым, но фиксированным размером.

Ответ 2

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" };

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

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(",");

Ответ 3

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

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

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

Ответ 4

Вы можете использовать класс 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");

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

Ответ 5

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

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.

Ответ 6

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.

Ответ 7

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

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

  • {{Инициализация с двойной привязкой}}, как известно, создает беспорядок класса и замедляет выполнение. Он также требует одну строку кода для каждого элемента.

  • Java 9: статический factory метод List.of возвращает структурно неизменный список, Кроме того, List.of основанный на значении, и поэтому его контракт не гарантирует, что он будет возвращать новый объект каждый раз.


Вот один однострочный ящик Java 8 для сбора нескольких отдельных объектов в ArrayList или любую коллекцию.

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

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