Я хотел создать список опций для целей тестирования. Сначала я сделал это:
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"));
Есть лучший способ сделать это?
java
collections
arraylist
initialization
Macarse
источник
источник
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]
Ответы:
На самом деле, вероятно, «лучший» способ инициализации
ArrayList
- это метод, который вы написали, так как он не должен создавать новыйList
способ:Подвох в том, что для ссылки на этот
list
экземпляр требуется довольно много печатания .Есть альтернативы, такие как создание анонимного внутреннего класса с инициализатором экземпляра (также известный как «инициализация двойной скобки»):
Тем не менее, я не слишком люблю этот метод, потому что в конечном итоге у вас есть подкласс, в
ArrayList
котором есть инициализатор экземпляра, и этот класс создается только для создания одного объекта, что кажется мне немного излишним.Было бы неплохо, если бы предложение Collection Literals для Project Coin было принято (оно должно было быть представлено в Java 7, но вряд ли оно будет частью Java 8).
К сожалению, это не поможет вам, так как будет инициализировать неизменяемый,
List
а неArrayList
, и, более того, он еще не доступен, если он когда-либо будет.источник
Было бы проще, если бы вы просто объявили его как
List
- это должен быть ArrayList?Или, если у вас есть только один элемент:
Это будет означать, что оно
places
является неизменным (попытка изменить его вызоветUnsupportedOperationException
исключение).Чтобы создать конкретный изменяемый список,
ArrayList
вы можете создать егоArrayList
из неизменяемого списка:источник
ArrayList
, было бы лучше изменить объявление наList
. Укажите интерфейсы, а не реализации.asList(...)
возвращает фиксированный размер,List
который взрывается при мутирующих операциях, таких какremove
иclear
вещи, которые, какList
утверждает договор, поддерживает. Даже если вы оставили объявление какList
, вам все равно придется использовать егоList l = new ArrayList(asList(...))
для получения объекта, который не генерирует исключения OperationNotSupported. Лисков Принцип подстановки у кого-нибудь?remove
иclear
являются необязательными операциями вList
, такasList(...)
же как и в случае с контрактом Нигде ОП не говорит, что ему нужно добавить больше элементов позже, пример только того,List
который нужно инициализировать тремя элементами.Простой ответ
В Java 9 или более поздней версии
List.of()
было добавлено:В Java 10 или более поздней версии это можно сократить с помощью
var
ключевого слова.Это даст вам неизменность
List
, поэтому его нельзя изменить.Это то, что вы хотите в большинстве случаев, когда вы его предварительно заполняете.
Java 8 или более ранняя версия:
Это обеспечит вам
List
массив, поэтому он не может изменить длину.Но вы можете позвонить
List.set
, так что он все еще изменчив .Вы можете сделать
Arrays.asList
еще короче с помощью статического импорта:Статический импорт:
Что любая современная IDE предложит и автоматически сделает для вас.
Например, в IntelliJ IDEA вы нажимаете
Alt+Enter
и выбираетеStatic import method...
.Однако я не рекомендую сокращать
List.of
метод доof
, потому что это сбивает с толку.List.of
уже достаточно короткий и хорошо читает.Используя
Stream
sПочему это должно быть
List
?С Java 8 или более поздней версии вы можете использовать
Stream
более гибкий:Вы можете объединить
Stream
s:Или вы можете пойти от
Stream
кList
:Но желательно, просто используйте,
Stream
не собирая егоList
.Если вам действительно нужно
java.util.ArrayList
(Вы, вероятно, нет.)
Цитировать JEP 269 (выделение мое):
Если вы хотите как предварительно заполнить ап
ArrayList
и добавить к нему впоследствии (почему?), Использованиеили в Java 8 или ранее:
или используя
Stream
:Но опять же, лучше просто использовать
Stream
напрямую, а не собирать его вList
.Программа для интерфейсов, а не для реализаций
Вы сказали, что объявили список
ArrayList
в своем коде, но вы должны делать это только в том случае, если вы используете какой-то членArrayList
, которого нет вList
.Что вы, скорее всего, не делаете.
Как правило , вы должны просто объявить переменные наиболее общий интерфейс , который вы собираетесь использовать (например
Iterable
,Collection
илиList
) и инициализировать их с выполнением конкретной (напримерArrayList
,LinkedList
илиArrays.asList()
).В противном случае вы ограничиваете свой код этим конкретным типом, и изменить его будет сложнее, когда вы захотите.
Например, если вы пропускание
ArrayList
кvoid method(...)
:Другим примером будет всегда объявлять переменную a,
InputStream
даже если это обычно aFileInputStream
или aBufferedInputStream
, потому что скоро вы или кто-то другой захотите использовать какой-то другой типInputStream
.источник
Arrays.asList
это статический метод. См. Docs.oracle.com/javase/1.5.0/docs/guide/language/…Если вам нужен простой список размером 1:
Если вам нужен список из нескольких объектов:
источник
С Guava вы можете написать:
В Гуаве есть и другие полезные статические конструкторы. Вы можете прочитать о них здесь .
источник
java.util.Arrays
такими, как,List<String> names = Arrays.asList("Beckah", "Sam", "Michael");
Литералы коллекции не попали в Java 8, но можно использовать Stream API для инициализации списка в одну довольно длинную строку:
Если вам необходимо убедиться , что ваш
List
являетсяArrayList
:источник
С Java-9и выше, как предложено в JEP 269: Методы фабрики удобства для коллекций , это может быть достигнуто с помощью литералов коллекции теперь с -
Аналогичный подход будет применяться и к
Map
-что аналогично предложению Collection Literals, как заявлено @coobird. Также уточняется в JEP -
альтернативы
Связанный: в чем смысл перегруженных методов фабрики удобства для коллекций в Java 9
источник
источник
Collections.unmodifiableList(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"))
, что иunmodifiableList(asList("Buenos Aires", "Córdoba", "La Plata"))
при статическом импорте. Вам не нужны Google Коллекции для этого.ImmutableList
другим методам, которые принимаютList
, и затем вы все равно потеряете эту документацию.Вы можете создать фабричный метод:
Но это не намного лучше, чем ваш первый рефакторинг.
Для большей гибкости он может быть общим:
источник
В Java 9 мы можем легко инициализировать
ArrayList
одну строку:или
Этот новый подход Java 9 имеет много преимуществ по сравнению с предыдущими:
Смотрите этот пост для более подробной информации -> В чем разница между List.of и Arrays.asList?
источник
О самом компактном способе сделать это:
источник
Просто используйте приведенный ниже код следующим образом.
источник
С Eclipse Collections вы можете написать следующее:
Вы также можете более точно указать типы, а также то, являются ли они изменяемыми или неизменяемыми.
Вы также можете сделать то же самое с наборами и сумками:
Примечание: я являюсь коммиттером для Eclipse Collections.
источник
Вот еще один способ:
источник
(Должен быть комментарий, но слишком длинный, поэтому новый ответ). Как уже упоминалось,
Arrays.asList
метод имеет фиксированный размер, но это не единственная проблема с ним. Он также не очень хорошо обрабатывает наследование. Например, предположим, у вас есть следующее:Вышеприведенное приводит к ошибке компилятора, потому что
List<B>
(то, что возвращается Arrays.asList) не является подклассомList<A>
, даже если вы можете добавить объекты типа B кList<A>
объекту. Чтобы обойти это, вам нужно сделать что-то вроде:Это, наверное, лучший способ сделать это, особенно. если вам нужен неограниченный список или вам нужно использовать наследование.
источник
Вы можете использовать следующие утверждения:
Фрагмент кода:
источник
letters = Arrays.asList(new String[]{"A", "B", "C"});
Как сказал Том :
Но так как вы жаловались на то, что хотите ArrayList, вы должны сначала знать, что ArrayList является подклассом List, и вы можете просто добавить эту строку:
Хотя, это может заставить вас жаловаться на «производительность».
В этом случае мне не имеет смысла, почему, поскольку ваш список предопределен, он не был определен как массив (так как размер известен во время инициализации). И если это вариант для вас:
Если вам не нужны незначительные различия в производительности, вы также можете очень просто скопировать массив в ArrayList:
Хорошо, но в будущем вам понадобится не только название места, но и код страны. Предполагая, что это все еще предопределенный список, который никогда не изменится во время выполнения, тогда можно использовать
enum
набор, который потребует повторной компиляции, если список потребуется изменить в будущем.станет:
Enum имеет статический
values
метод, который возвращает массив, содержащий все значения enum в порядке их объявления, например:В этом случае, я думаю, вам не нужен ваш ArrayList.
PS Рандяа продемонстрировал еще один приятный способ, используя статический служебный метод Collections.addAll .
источник
Java 9 имеет следующий метод для создания неизменяемого списка:
который легко адаптируется для создания изменяемого списка, если требуется:
Подобные методы доступны для
Set
иMap
.источник
источник
Да, с помощью массивов вы можете инициализировать список массивов в одну строку,
источник
Вы можете использовать
StickyList
от Cactoos :источник
Попробуйте с этой строкой кода:
источник
В Java вы не можете сделать
Как было указано, вам нужно выполнить инициализацию в виде двойной скобки:
Но это может заставить вас добавить аннотацию
@SuppressWarnings("serial")
или создать серийный UUID, который раздражает. Кроме того, большинство форматировщиков кода развернут это в несколько операторов / строк.В качестве альтернативы вы можете сделать
но тогда вы можете сделать
@SuppressWarnings("unchecked")
.Также в соответствии с Javadoc вы должны быть в состоянии сделать это:
Но я не могу заставить его скомпилировать с JDK 1.6.
источник
Если вам нужно иметь список из одного элемента !
Коллекции из пакета java.util .
источник
Лучший способ сделать это:
Просто создайте функцию, которая может иметь столько элементов, сколько вы хотите, и вызовите ее, чтобы добавить их в одну строку.
источник
Object
.Вот код от AbacusUtil
Декларация: я разработчик AbacusUtil.
источник
Для меня Arrays.asList () - лучший и удобный. Мне всегда нравится инициализировать этот путь. Если вы новичок в коллекциях Java, я бы хотел, чтобы вы ссылались на инициализацию ArrayList
источник
add()
методами?Почему бы не сделать простую служебную функцию, которая делает это?
«
ll
» означает «буквальный список».источник
интересно, что ни один вкладыш с другим перегруженным
Stream::collect
методом не указанисточник
На самом деле, это можно сделать в одну строку:
источник