”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java中如何使用Streams计算最大值和最小值?

Java中如何使用Streams计算最大值和最小值?

发布于2024-11-18
浏览:149

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

在这篇文章中,我们将了解如何使用 Java Streams API 来计算元素集合的最大值和最小值。为此,我们将使用 Stream 类的 max() 和 min() 方法。这些方法允许我们使用自定义比较器分别获取元素集合的最大值和最小值。

假设我们有一个类型为 List 的列表,其中 Exam 是一条具有 name 和 Grade 两个属性的记录,我们想要获取成绩最高和成绩最低的考试。

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 中,您可以使用 Stream 类的 max() 和 min() 方法来实现此目的,方法是传递自定义比较器并获取带有结果的Optional。如果Java版本不支持max()和min()方法,则可以使用collect()方法传递Collector作为参数,Collectors.maxBy()或Collectors.minBy(),然后依次传递一个Collectors.maxBy()或Collectors.minBy(),个性化比较器。如果您在最新版本的 Java 中使用最后一个选项,IDE 本身会建议将其更改为 max() 或 min() 方法。

让我们首先创建一个 Comparator 类型的自定义比较器,它允许我们按升序获取成绩。

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

例如,如果第一次考试的成绩低于第二次考试的成绩,则该比较器将返回负数;如果相等,则返回零;如果第一次考试的成绩大于第二次考试的成绩,则该比较器将返回正数。第二个,有关更多信息,您可以查阅此链接,该链接指向解释比较器界面如何工作的帖子。

可以使用 Comparator 类的 ComparisonDouble() 方法以另一种方式定义该比较器,该方法允许我们从从对象中提取双精度值的函数创建比较器,而无需手动编写比较器。

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

在此定义中,比较器被告知它必须采用 Exam 类型的对象,提取 Grade 属性的值并使用 Double 数据类型比较这些值。

这两种方式是等价的,可以互换使用,第二种方式一开始可能有点难以理解,但是一旦理解了它就更容易编写和阅读。

既然你有了比较器,剩下的就是在 max() 和 min() 方法中使用它来分别获得最高和最低分数的考试。

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

在这种情况下,将分别通过最高分和最低分的考试获得可选。如果考试列表为空,将返回Optional.empty()。要获取Optional的值,您可以使用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

或者简单地传递一个引用方法作为参数来打印Optional的值,如果Optional为空则不会打印任何内容,否则将通过调用Exam对象的toString()方法来打印Optional的值

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如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3