«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как рассчитать максимум и минимум в Java с помощью потоков?

Как рассчитать максимум и минимум в Java с помощью потоков?

Опубликовано 18 ноября 2024 г.
Просматривать:913

¿Cómo calcular el máximo y mínimo en Java usando Streams?

В этом посте мы увидим, как использовать API Java Streams для вычисления максимума и минимума коллекции элементов. Для этого мы собираемся использовать методы max() и min() класса Stream. Эти методы позволяют нам получить максимум и минимум коллекции элементов соответственно, используя собственный компаратор.

Предположим, у нас есть список типа List, где Exam — это запись с двумя свойствами: именем и оценкой, и мы хотим получить экзамен с самой высокой оценкой и самой низкой оценкой.

public record Exam(String name, Double grade) { }
var exams = Arrays.asList(
        new Exam("Alice", 9.5),
        new Exam("Bob", 6.0),
        new Exam("Charlie", 7.5),
        new Exam("David", 8.0),
        new Exam("Eve", 8.5)
);

В последних версиях Java для этой цели можно использовать методы max() и min() класса Stream, передав пользовательский компаратор и получив с результатом необязательный. Если версия Java не поддерживает методы max() и min(), можно использовать метод Collect(), передав Collector в качестве параметра либо Collectors.maxBy(), либо Collectors.minBy(), и, в свою очередь, персональный компаратор. Если вы используете последний вариант в последней версии Java, сама IDE предложит изменить его на метод max() или min().

Давайте начнем с создания собственного компаратора типа Comparator, который позволит нам получать оценки в порядке возрастания.

Comparator byGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());

Например, этот компаратор вернет отрицательное число, если оценка первого экзамена меньше оценки второго, ноль, если они равны, и положительное число, если оценка первого экзамена выше, чем оценка второго. во-вторых, для получения дополнительной информации вы можете обратиться по этой ссылке к сообщению, в котором объясняется, как работает интерфейс Comparator.

Этот компаратор можно определить другим способом, используя метод CompareDouble() класса Comparator, который позволяет нам создать компаратор из функции, извлекающей двойное значение из объекта, без необходимости писать компаратор вручную.
]

Comparator byGradeAscClean = Comparator.comparingDouble(Exam::grade);

В этом определении компаратору сообщается, что он должен взять объект типа Exam, извлечь значение свойства Grade и сравнить значения, используя тип данных Double.

Эти два способа эквивалентны и могут использоваться как взаимозаменяемые, второй может быть немного сложнее понять поначалу, но как только вы его поймете, его будет легче писать и читать.

Теперь, когда у вас есть компаратор, остается только использовать его в методах max() и min() для получения экзамена с наивысшим и наименьшим баллом соответственно.

var highestGrade = exams.stream().max(byGradeAscClean);
var lowestGrade = exams.stream().min(byGradeAscClean);

В этом случае необязательный получается для экзамена с наивысшим и наименьшим баллом соответственно. Если список экзаменов пуст, будет возвращен необязательный.empty(). Чтобы получить значение необязательного параметра, вы можете использовать метод ifPresent(), который получает Consumer и выполняет код, переданный ему в качестве аргумента, если значение существует.

highestGrade.ifPresent(ex -> System.out.println("Highest grade: "   ex.name()   " "   ex.grade()));
lowestGrade.ifPresent(ex -> System.out.println("Lowest grade: "   ex.name()   " "   ex.grade()));

// Output
Highest grade: Alice 9.5
Lowest grade: Bob 6.0

Или просто передайте ссылочный метод в качестве аргумента для печати значения необязательного параметра. Если необязательный параметр пуст, ничего не будет напечатано, в противном случае значение необязательного параметра будет напечатано путем вызова метода toString() объекта Exam.

highestGrade.ifPresent(System.out::println);
lowestGrade.ifPresent(System.out::println);

// Output
Exam[name=Alice, grade=9.5]
Exam[name=Bob, grade=6.0]

Таким образом можно получить максимум и минимум коллекции элементов с помощью Java Streams API и интерфейса Comparator.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/asjordi/como-calcular-el-maximo-y-minimo-en-java-usando-streams-2fca?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163 .com, чтобы удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3