Как объединить два списка
Короткий ответ
Создайте новый список из первого и добавьте второй через addAll():
void main() {
var a = List.of(1, 2, 3);
var b = List.of(4, 5);
var merged = new ArrayList<>(a);
merged.addAll(b);
IO.println(merged);
}Результат:
[1, 2, 3, 4, 5]Через поток
Stream.concat() склеивает два потока:
void main() {
var a = List.of("x", "y");
var b = List.of("z");
IO.println(Stream.concat(a.stream(), b.stream()).toList());
}Результат:
[x, y, z]Много списков
Для нескольких списков используйте flatMap():
void main() {
var parts = List.of(List.of(1, 2), List.of(3), List.of(4, 5));
IO.println(parts.stream().flatMap(List::stream).toList());
}Результат:
[1, 2, 3, 4, 5]Без повторов
LinkedHashSet уберёт повторы и сохранит порядок:
void main() {
var a = List.of("java", "sql");
var b = List.of("sql", "git");
var union = new LinkedHashSet<>(a);
union.addAll(b);
IO.println(union);
}Результат:
[java, sql, git]Частая ошибка
Вызвать addAll() у списка из List.of(). Он неизменяемый:
void main() {
var a = List.of(1, 2);
a.addAll(List.of(3));
}Результат:
Exception in thread "main" java.lang.UnsupportedOperationExceptionФункции из этого ответа
- List.addAll() — Добавляет в список все элементы другой коллекции.
- Stream.of() — Создаёт поток из перечисленных значений.
- LinkedHashSet — Множество, которое помнит порядок добавления элементов.