1. Введение
В этом кратком руководстве мы увидим, как найти максимальное и минимальное значения в массиве с помощью Stream
API Java 8.
Мы начнем с поиска минимума в массиве целых чисел, а затем найдем максимум в массиве объектов.
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.stream.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
, используя статический метод потока в
Arrays
. Существуют эквивалентные потоковые
методы для каждого типа примитивного массива.
Так как массив может быть пустым, min
возвращает Optional,
поэтому для преобразования его в 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);
}
В этом случае поток
статического метода Arrays
возвращает экземпляр интерфейса java.util.stream.Stream<T>
, где для метода max
требуется Comparator
.
Мы могли бы создать свой собственный Comparator
, но Comparator.comparing
гораздо проще.
Обратите внимание еще раз, что max
возвращает необязательный
экземпляр по той же причине, что и раньше.
Мы можем либо получить
это значение, либо сделать что-то еще с необязательными
s, например, orElseThrow
, который выдает исключение, если max
не возвращает значение.
5. Вывод
В этой короткой статье мы увидели, насколько просто и компактно можно найти максимум и минимум в массиве, используя Stream
API Java 8.
Дополнительные сведения об этой библиотеке см. в документации Oracle .
Реализацию всех этих примеров и фрагментов кода можно найти на GitHub .