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 .