Одна строка для инициализации ArrayList? Рекомендуем | Примечания по отладке Java

Java

Эта статья участвует в "Месяце тем Java - Заметки по отладке Java", подробности см.Ссылка на мероприятие

Вопрос: Инициализировать ArrayList одной строкой

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

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

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

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

Есть ли способ лучше?

Высокий балл ответа:

Много очков знаний, действительно нужно написать, чтобы освоить!!! \color{purple}Много очков знаний, вам действительно нужно их записать, чтобы стать мастером!!!{~}

простой ответ Java 10 или выше:

var strings = List.of("foo", "bar", "baz");

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

Java 9

Если вы используете Java 9, вы не можете использовать ключевое слово var:


List<String> strings = List.of("foo", "bar", "baz");

Java 8 или более ранняя версия:

List<String> strings = Arrays.asList("foo", "bar", "baz");

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

* Детали реализации: это закрытый вложенный класс java.util.Arrays с именем ArrayList, хотя их простые имена одинаковы, В отличие от класса java.util.ArrayList. статический импорт

Вы можете сделать его короче в Java 8, статически импортировав Arrays.asList:

import static java.util.Arrays.asList;  
...
List<String> strings = asList("foo", "bar", "baz");

Любая современная IDE* даст вам совет и помощь.

Я не рекомендую статически импортировать статический метод List.of просто потому, что это сбивает с толку.

*Например, в IntelliJ IDEA нажмите Alt+Enter и выберите Статический метод импорта... Использование потоков

Почему это должен быть список? В Java 8 или более поздней версии вы можете использовать Stream, который является более гибким:


Stream<String> strings = Stream.of("foo", "bar", "baz");

Вы можете объединить потоки:

Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
                                       Stream.of("baz", "qux"));

Кроме того, вы можете перейти от потока к списку:

import static java.util.stream.Collectors.toList;
...
var strings = Stream.of("foo", "bar", "baz").toList(); // Java 16

List<String> strings = Stream.of("foo", "bar", "baz").collect(toList()); // Java 8

Но лучше использовать Stream, не собирая его в List. Если вам конкретно нужен java.util.ArrayList*

Если вы хотите предварительно заполнить ArrayList и добавить к нему впоследствии, используйте

List<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");

или в Java 8 или более ранней версии:

List<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");

или используйте поток:

import static java.util.stream.Collectors.toCollection;

List<String> strings = Stream.of("foo", "bar")
                             .collect(toCollection(ArrayList::new));
strings.add("baz");

Но опять же, лучше использовать поток напрямую, а не собирать его в список.

* Вероятно, вам не нужен специальный ArrayList. Цитирую JEP 269:

有少量用例用于使用预定义的值集初始化可变集合实例。通常最好将这些预定义值放在不可变的集合中,然后通过复制构造函数初始化可变集合。

(выделено мной) Интерфейс программы, а не реализация

Вы сказали, что объявили ArrayList в своем коде как список, но вам следует делать это только в том случае, если вы используете ArrayList, который не является членом List .

Вы, скорее всего, нет.

Обычно вам следует передавать только общие интерфейсы, которые вы хотите использовать (например, объявлять переменные Iterable, Collection или List) и инициализировать их конкретными реализациями (например, ArrayList, LinkedList или Arrays.asList()).

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

Например, если вы передадите ArrayList методу void(...):

// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) { 
    for (String s : strings) { ... } 
}

// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
    if (!strings.isEmpty()) { strings.stream()... }
}

// List if you also need .get(index):
void method(List<String> strings) {
    strings.get(...)
}

// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
    ??? // You don't want to limit yourself to just ArrayList
}

Статья переведена сАминь 2 несколько ярлыков соответственно 6 дорвей 75 колит стал 67 там-AC4 из 6, 2, 7, очевидно 2 ах-переполнение стека-com.translate.о боже/вопросы/2…

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

Добро пожаловать в мою колонкуStackOverFlow,Я просматриваю качественные вопросы и ответы и часто беру интервью!!! \color{red}Приглашаю обратить внимание на мою колонку StackOverFlow, я буду выбирать качественные вопросы и ответы и часто брать интервью!!!{~}

Есть новейшие и элегантные методы реализации, и я также напишу свое мнение по этому Q&A в конце статьи.\color{red} имеет самую последнюю и элегантную реализацию, и я также напишу свое мнение об этом вопросе и ответе в конце статьи{~}

Искренне благодарю красивых и красивых девушек за то, что смогли это увидеть.Если эта статья будет хорошо написана, если вы почувствуете, что есть что-то

Ставьте лайк 👍 Подписывайтесь ❤️ Делитесь 👥 Мне очень полезно с 8 пакетами пресса! ! !

Если в этом блоге есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится! ❤️❤️❤️❤️