Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Вспомогательные методы коллекций

Для типовых задач с коллекциями не нужно писать циклы: найти максимум, перевернуть список, посчитать повторы. Готовые статические методы собраны в классе 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
3

max() и 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)).

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.