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

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

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

¿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]删除
最新教程 更多>
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-06-05
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-06-05
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-06-05
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“检测”中的错误:在功能检测中。”当Face Cascade分类器(即面部检测至关重要的组件)未正确加载时,通常会出现此错误。要解决此问题,必须...
    编程 发布于2025-06-05
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-06-05
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-06-05
  • Python环境变量的访问与管理方法
    Python环境变量的访问与管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    编程 发布于2025-06-05
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-06-05
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-06-05
  • 解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    编程 发布于2025-06-05
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-06-05
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    在Go Slices中的垃圾收集:详细的分析在GO中,Slice是一个动态数组,引用了基础阵列。使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄漏。考虑使用slice使用slice的以下实现:字符串{ R:=(*Q)[0] *q =(*q)[1:len(*q)] 返回...
    编程 发布于2025-06-05
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-06-05
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示 仅通过Python的MlStripper 来简化剥离过程,Python Standard库提供了一个专门的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    编程 发布于2025-06-05

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

Copyright© 2022 湘ICP备2022001581号-3