В этом посте мы увидим, как использовать API Java Streams для вычисления максимума и минимума коллекции элементов. Для этого мы собираемся использовать методы max() и min() класса Stream. Эти методы позволяют нам получить максимум и минимум коллекции элементов соответственно, используя собственный компаратор.
Предположим, у нас есть список типа List
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, передав пользовательский компаратор и получив с результатом необязательный
Давайте начнем с создания собственного компаратора типа Comparator
ComparatorbyGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());
Например, этот компаратор вернет отрицательное число, если оценка первого экзамена меньше оценки второго, ноль, если они равны, и положительное число, если оценка первого экзамена выше, чем оценка второго. во-вторых, для получения дополнительной информации вы можете обратиться по этой ссылке к сообщению, в котором объясняется, как работает интерфейс Comparator.
Этот компаратор можно определить другим способом, используя метод CompareDouble() класса Comparator, который позволяет нам создать компаратор из функции, извлекающей двойное значение из объекта, без необходимости писать компаратор вручную.
]
ComparatorbyGradeAscClean = Comparator.comparingDouble(Exam::grade);
В этом определении компаратору сообщается, что он должен взять объект типа Exam, извлечь значение свойства Grade и сравнить значения, используя тип данных Double.
Эти два способа эквивалентны и могут использоваться как взаимозаменяемые, второй может быть немного сложнее понять поначалу, но как только вы его поймете, его будет легче писать и читать.
Теперь, когда у вас есть компаратор, остается только использовать его в методах max() и min() для получения экзамена с наивысшим и наименьшим баллом соответственно.
var highestGrade = exams.stream().max(byGradeAscClean); var lowestGrade = exams.stream().min(byGradeAscClean);
В этом случае необязательный
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.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3