Вспомогательные методы коллекций
Для типовых задач с коллекциями не нужно писать циклы: найти максимум, перевернуть список, посчитать повторы. Готовые статические методы собраны в классе Collections — с буквой «s» на конце, в отличие от интерфейса Collection.
Максимум, минимум и подсчёт
Collections.max() и Collections.min() находят наибольший и наименьший элемент, а Collections.frequency() считает, сколько раз встречается значение:
void main() {
List<Integer> grades = List.of(4, 5, 3, 5, 4, 5);
IO.println(Collections.max(grades));
IO.println(Collections.min(grades));
IO.println(Collections.frequency(grades, 5));
}Результат:
5
3
3max() и min() принимают и компаратор вторым аргументом — например, чтобы найти самое длинное слово.
Перестановки
reverse() переворачивает список, swap() меняет местами два элемента, а shuffle() перемешивает в случайном порядке. Все они меняют сам список:
void main() {
List<String> steps = new ArrayList<>(List.of("раз", "два", "три"));
Collections.reverse(steps);
IO.println(steps);
Collections.swap(steps, 0, 2);
IO.println(steps);
}Результат:
[три, два, раз]
[раз, два, три]У shuffle() результат при каждом запуске разный — так перемешивают колоду карт или вопросы теста.
Заполнение
Collections.nCopies() создаёт список из одинаковых элементов, а Collections.addAll() добавляет в коллекцию сразу несколько значений:
void main() {
List<String> seats = new ArrayList<>(Collections.nCopies(4, "свободно"));
seats.set(1, "занято");
IO.println(seats);
Set<String> colors = new TreeSet<>();
Collections.addAll(colors, "синий", "белый", "синий");
IO.println(colors);
}Результат:
[свободно, занято, свободно, свободно]
[белый, синий]Копия или представление
List.copyOf() делает неизменяемую копию: дальнейшие изменения оригинала её не затрагивают. Collections.unmodifiableList() возвращает представление — «окно» только для чтения на тот же список. Через окно менять нельзя, но изменения оригинала в нём видны:
void main() {
List<String> team = new ArrayList<>(List.of("Анна"));
List<String> copy = List.copyOf(team);
List<String> view = Collections.unmodifiableList(team);
team.add("Олег");
IO.println(copy);
IO.println(view);
}Результат:
[Анна]
[Анна, Олег]Представление подходит для геттера, когда наружу нужно отдать актуальные данные без права их менять.
Пустые коллекции
Метод, которому нечего вернуть, должен возвращать пустую коллекцию, а не null — тогда вызывающему коду не нужны лишние проверки. Для этого есть List.of() без аргументов, а также Map.of() и Set.of():
List<String> findByTag(String tag) {
if (tag.equals("java")) {
return List.of("Урок 1", "Урок 2");
}
return List.of();
}
void main() {
IO.println(findByTag("java").size());
IO.println(findByTag("php").size());
}Результат:
2
0Частая ошибка
Arrays.asList() превращает массив в список, но этот список имеет фиксированный размер: заменять элементы можно, а добавлять — нет:
void main() {
String[] array = { "a", "b" };
List<String> list = Arrays.asList(array);
list.set(0, "z");
IO.println(list);
list.add("c");
}Результат:
[z, b]
Exception in thread "main" java.lang.UnsupportedOperationExceptionЕсли список будет расти, создайте полноценный: new ArrayList<>(Arrays.asList(array)).