在这篇文章中,我们将了解如何使用 Java Streams API 来计算元素集合的最大值和最小值。为此,我们将使用 Stream 类的 max() 和 min() 方法。这些方法允许我们使用自定义比较器分别获取元素集合的最大值和最小值。
假设我们有一个 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 的最新版本中,您可以通过传递自定义比较器并获取Optional
让我们首先创建一个 Comparator
Comparator<Exam> byGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());
举个例子,如果第一次考试的成绩小于第二次考试的成绩,则该比较器将返回负数;如果相等,则返回零;如果第一次考试的成绩大于第二次考试的成绩,则该比较器将返回正数第二个,有关更多信息,您可以查阅此链接,该链接指向解释比较器界面如何工作的帖子。
可以使用 Comparator 类的 ComparisonDouble() 方法以另一种方式定义该比较器,该方法允许我们从从对象中提取 double 值的函数创建比较器,而无需手动编写比较器。
Comparator<Exam> byGradeAscClean = Comparator.comparingDouble(Exam::grade);
在此定义中,比较器被告知它必须采用 Exam 类型的对象,提取 Grade 属性的值并使用 Double 数据类型比较这些值。
这两种方式是等价的,可以互换使用,第二种方式一开始可能有点难理解,但是一旦你理解了它就更容易编写和阅读。
现在你有了比较器,剩下的就是在 max() 和 min() 方法中使用它来分别获得最高和最低分数的考试。
public record Exam(String name, Double grade) { }
在这种情况下,您将获得可选的<考试>分别是考试的最高分和最低分。如果考试列表为空,将返回Optional.empty()。要获取Optional的值,您可以使用ifPresent()方法,该方法接收Consumer并执行作为参数传递给它的代码(如果值存在)。
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) );
或者简单地传递一个引用方法作为参数来打印Optional的值,如果Optional为空则不会打印任何内容,否则将通过调用Exam对象的toString()方法来打印Optional的值
Comparator<Exam> byGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());
通过这种方式,您可以使用 Java Streams API 和 Comparator 接口获取元素集合的最大值和最小值。
以上是Java中如何使用Streams计算最大值和最小值?的详细内容。更多信息请关注PHP中文网其他相关文章!