Эта статья участвует в "Месяце тем 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"));
Есть ли способ лучше?
Высокий балл ответа:
простой ответ 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
Искренне благодарю красивых и красивых девушек за то, что смогли это увидеть.Если эта статья будет хорошо написана, если вы почувствуете, что есть что-то
Ставьте лайк 👍 Подписывайтесь ❤️ Делитесь 👥 Мне очень полезно с 8 пакетами пресса! ! !
Если в этом блоге есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится! ❤️❤️❤️❤️