1. введение
В этом коротком уроке мы рассмотрим, как найти максимальное и минимальное значения в массиве, используя Java 8 Stream API.
Мы начнем с нахождения минимума в массиве целых чисел, а затем найдем максимум в массиве объектов.
2. Обзор
Существует множество способов найти минимальное или максимальное значение в неупорядоченном массиве, и все они выглядят примерно так:
SET MAX to array[0]
FOR i = 1 to array length - 1
IF array[i] > MAX THEN
SET MAX to array[i]
ENDIF
ENDFORМы рассмотрим, как Java 8 может скрыть от нас эти детали . Но в тех случаях, когда API Java нам не подходит, мы всегда можем вернуться к этому базовому алгоритму.
Поскольку нам нужно проверить каждое значение в массиве, все реализации являются O(n) .
3. Нахождение наименьшего значения
Поток java.util.Интерфейс IntStream предоставляет метод min |, который будет отлично работать для наших целей.
Поскольку мы работаем только с целыми числами, min не требует компаратора :
@Test
public void whenArrayIsOfIntegerThenMinUsesIntegerComparator() {
int[] integers = new int[] { 20, 98, 12, 7, 35 };
int min = Arrays.stream(integers)
.min()
.getAsInt();
assertEquals(7, min);
}Обратите внимание, как мы создали объект Integer stream с помощью статического метода stream в Массивы . Для каждого типа примитивного массива существуют эквивалентные методы stream .
Поскольку массив может быть пустым, min возвращает Необязательный, поэтому, чтобы преобразовать его в int , мы используем getAsInt .
4. Поиск самого большого пользовательского объекта
Давайте создадим простое POJO:
public class Car {
private String model;
private int topSpeed;
// standard constructors, getters and setters
}И тогда мы можем снова использовать Stream API, чтобы найти самый быстрый автомобиль в массиве Car s:
@Test
public void whenArrayIsOfCustomTypeThenMaxUsesCustomComparator() {
Car porsche = new Car("Porsche 959", 319);
Car ferrari = new Car("Ferrari 288 GTO", 303);
Car bugatti = new Car("Bugatti Veyron 16.4 Super Sport", 415);
Car mcLaren = new Car("McLaren F1", 355);
Car[] fastCars = { porsche, ferrari, bugatti, mcLaren };
Car maxBySpeed = Arrays.stream(fastCars)
.max(Comparator.comparing(Car::getTopSpeed))
.orElseThrow(NoSuchElementException::new);
assertEquals(bugatti, maxBySpeed);
}В этом случае статический метод stream из Массивов возвращает экземпляр интерфейса java.util.stream.Stream , где метод max требует компаратора .
Мы могли бы создать свой собственный Компаратор , но Comparator.comparing намного проще.
Еще раз обратите внимание, что max возвращает Необязательный экземпляр по той же причине, что и раньше.
Мы можем либо получить это значение, либо мы можем сделать все возможное с Необязательными s, например orElseThrow , который создает исключение, если max не возвращает значение.
5. Заключение
В этой короткой статье мы увидели, как легко и компактно найти max и min в массиве, используя Stream API Java 8.
Для получения дополнительной информации об этой библиотеке, пожалуйста, обратитесь к документации Oracle .
Реализацию всех этих примеров и фрагментов кода можно найти на GitHub .