Я ищу самый короткий путь (в коде) для инициализации списка строк и массива строк, т.е. списка/массива, содержащего Строковые элементы "s1", "s2", "s3".
Каков самый короткий способ инициализировать список строк в java?
Ответ 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"))
) также является превосходным.