Проста відповідь
У Java 9 або новіших версіях після List.of()
додано:
List<String> strings = List.of("foo", "bar", "baz");
З Java 10 або пізнішої версії це можна скоротити за допомогою var
ключового слова.
var strings = List.of("foo", "bar", "baz");
Це дасть вам непорушну силу List
, тому її неможливо змінити.
Що саме ви хочете в більшості випадків, коли ви нарощуєте це.
Java 8 або новіші версії:
List<String> strings = Arrays.asList("foo", "bar", "baz");
Це дасть вам List
підтримку масиву, тому він не може змінити довжину.
Але ти можеш зателефонувати List.set
, тож він все ще змінюється .
Можна стати Arrays.asList
ще коротшим за допомогою статичного імпорту:
List<String> strings = asList("foo", "bar", "baz");
Статичний імпорт:
import static java.util.Arrays.asList;
Що будь-який сучасний IDE запропонує і автоматично зробить для вас.
Наприклад, в IntelliJ IDEA ви натискаєте Alt+Enter
та вибираєте Static import method...
.
Однак я не рекомендую скорочувати List.of
метод of
, оскільки це стає заплутаним.
List.of
вже досить короткий і добре читає.
Використання Stream
s
Чому це повинно бути List
?
З Java 8 або новішої версії ви можете використовувати Stream
гнучкіший:
Stream<String> strings = Stream.of("foo", "bar", "baz");
Ви можете об'єднати Stream
s:
Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
Stream.of("baz", "qux"));
Або ви можете перейти від точки Stream
до List
:
import static java.util.stream.Collectors.toList;
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());
Але бажано просто скористатись, Stream
не збираючи її до а List
.
Якщо ви дійсно потребуєтеjava.util.ArrayList
(Ви, мабуть, не знаєте .)
Щоб цитувати JEP 269 (акцент мій):
Існує невеликий набір випадків використання для ініціалізації змінного екземпляра колекції з попередньо визначеним набором значень. Зазвичай бажано, щоб ці заздалегідь задані значення були у незмінній колекції, а потім ініціалізувати колекцію змінних через конструктор копій.
Якщо ви хочете одночасно популяризувати ArrayList
та додати до нього згодом (чому?), Використовуйте
ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");
або на Java 8 чи новіших версіях:
ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");
або використовуючи Stream
:
import static java.util.stream.Collectors.toCollection;
ArrayList<String> strings = Stream.of("foo", "bar")
.collect(toCollection(ArrayList::new));
strings.add("baz");
Але знову ж таки, краще просто скористатися Stream
безпосередньо, а не збирати його на a List
.
Програма на інтерфейси, а не на реалізацію
Ви сказали, що ви оголосили список ArrayList
у своєму коді, але це слід робити лише у тому випадку, якщо ви використовуєте когось із членів, ArrayList
яких немає List
.
Що ви, швидше за все, не робите.
Як правило , ви повинні просто оголосити змінні найбільш загальний інтерфейс , який ви збираєтеся використовувати (наприклад Iterable
, Collection
чи List
) і форматувати їх з виконанням конкретної (наприклад ArrayList
, LinkedList
чи Arrays.asList()
).
Інакше ви обмежуєте свій код саме певним типом, і це буде важче змінити, коли ви хочете.
Наприклад, якщо ви переходите ArrayList
до void method(...)
:
// 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
}
Іншим прикладом завжди буде оголошення змінної "a", InputStream
хоча це звичайно a FileInputStream
або a BufferedInputStream
, тому що одного разу незабаром ви або хтось інший захочете використовувати якийсь інший тип InputStream
.
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]