Как найти максимум и минимум в списке
Короткий ответ
Collections.max() и Collections.min() находят наибольший и наименьший элементы:
void main() {
var numbers = List.of(7, 2, 9, 4);
IO.println(Collections.max(numbers));
IO.println(Collections.min(numbers));
}Результат:
9
2По полю объекта
Передайте компаратор по нужному полю:
record Product(String name, double price) {}
void main() {
var products = List.of(new Product("Tea", 3.5), new Product("Cake", 12.0), new Product("Water", 1.2));
var expensive = Collections.max(products, Comparator.comparingDouble(Product::price));
IO.println(expensive.name());
}Результат:
CakeЧерез поток
Stream.max() возвращает Optional — это безопасно для пустого списка:
void main() {
List<Integer> empty = List.of();
IO.println(empty.stream().max(Integer::compare));
IO.println(empty.stream().max(Integer::compare).orElse(0));
}Результат:
Optional.empty
0Частая ошибка
Вызвать Collections.max() у пустого списка:
void main() {
List<Integer> empty = new ArrayList<>();
IO.println(Collections.max(empty));
}Результат:
Exception in thread "main" java.util.NoSuchElementExceptionПроверьте isEmpty() заранее или используйте поток с orElse().
Функции из этого ответа
- Collections.max() — Находит наибольший элемент коллекции.
- Collections.min() — Находит наименьший элемент коллекции.
- Stream.max() — Находит наибольший элемент потока.
- Comparator.comparing() — Создаёт компаратор, который сравнивает объекты по одному полю.