”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java 中的流和 Lambda:函数式编程示例指南

Java 中的流和 Lambda:函数式编程示例指南

发布于2024-08-21
浏览:606

Streams and Lambdas in Java: A Guide to Functional Programming with Examples

函数式编程是现代软件开发中广泛使用的方法。 Java 是一种同时支持面向对象和函数式编程的语言,在其第 8 个版本中引入了流和 lambda。这些功能允许开发人员将函数式风格应用于集合,使集合操作更加高效和干净。

Java 中的流
Java 中的流将集合转变为元素流。它们使开发人员能够对集合执行功能操作,例如映射、过滤和归约。流最适合涉及数据转换、聚合或过滤的操作。

使用流的一个示例是按字母顺序对名称列表进行排序。我们可以创建一个名称列表,然后使用流对它们进行排序,如下所示:

List 名称 = Arrays.asList("约翰", "玛丽", "大卫", "艾米丽", "汤姆");
name.stream().sorted().forEach(System.out::println); //输出:大卫、艾米丽、约翰、玛丽、汤姆

在这里,我们使用列表上的stream()方法创建了一个流。然后我们应用了sorted()方法来按自然顺序对流中的元素进行排序。最后使用forEach()方法打印流中的每个元素。

Java 中的 Lambda 函数
Lambda 用于在 Java 中定义一等函数。这些函数可以使用流中的元素并对它们执行操作。 Lambda 是在类外部定义的,可以作为参数传递给函数。

要将 lambda 表达式与流结合使用,我们需要了解函数式接口的概念。这些接口只有一个抽象方法。 Lambda 表达式可用于为函数式接口的抽象方法提供具体实现。

使用 lambda 对名称列表进行排序
在上面的示例的基础上,让我们使用 lambda 对名称进行降序排序。

List 名称 = Arrays.asList("约翰", "玛丽", "大卫", "艾米丽", "汤姆");
name.stream().sorted((a, b) -> b.compareTo(a)).forEach(System.out::println)); //输出:汤姆、玛丽、约翰、艾米丽、大卫

在这里,我们使用 lambda 表达式作为 Sorted() 方法的参数。此 lambda 函数接受两个参数(a 和 b)并对它们进行比较,根据比较结果返回正值、负值或零值。这允许我们使用元素上的compareTo()方法按降序对元素进行排序。

将流转回集合
在某些情况下,我们可能希望在对流执行操作后将其转换回集合。我们可以使用collect()方法来做到这一点,该方法接受Collector对象作为参数。

ListfilteredNames=names.stream()
.filter(name -> name.length() > 4) //仅保留长度> 4的名称
.collect(Collectors.toList()); //返回过滤后的名称列表

collect() 方法采用 Collector 类型的功能接口,并使用它将元素累积到集合中。在上面的示例中,我们使用 Collectors 类中的 toList() 方法来创建过滤名称列表。

流上的其他操作
除了排序和过滤之外,还可以对流执行其他操作,例如映射、归约和迭代。这些操作允许我们分别对流中的元素进行转换、减少和迭代。

映射和减少数字流
假设我们有一个数字列表,我们想要找到所有偶数的总和。我们可以使用map()和reduce()方法来做到这一点。

List 数字 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = Numbers.stream()
.filter(num -> num % 2 == 0) //过滤掉奇数
.map(num -> num * 2) //偶数加倍
.reduce(0, (a, b) -> a b); //将所有数字加在一起

在这里,我们使用map()方法将流中的偶数加倍,然后使用reduce()方法将所有数字加在一起。结果是列表中所有偶数的总和。

流上的重用操作
在某些情况下,我们可能需要在多个流上使用相同的功能操作。为了避免一遍又一遍地编写相同的代码,我们可以创建一个函数接口并将其作为参数传递给方法。

让我们以按姓氏对姓名列表进行排序为例。我们可以创建一个实现Comparator接口的比较器类,并将其作为参数传递给sorted()方法。

静态类 LastNameComparator 实现 Comparator {
@覆盖
公共 int 比较(字符串名称1,字符串名称2){
String[] parts1 = name1.split(" ");
字符串lastName1 = parts1[parts1.length - 1];
String[] parts2 = name2.split(" ");
字符串lastName2 = parts2[parts2.length - 1];
返回lastName2.compareTo(lastName1);
}
}

name.stream().sorted(new LastNameComparator()).forEach(System.out::println); //输出:艾米丽、大卫、约翰、玛丽、汤姆

在这里,我们将 LastNameComparator 作为参数传递给排序()方法,以按姓氏对名称进行排序。

结论
Java 中的流和 lambda 提供了一种强大且高效的方法来对集合执行函数操作。它们使开发人员能够编写干净、简洁且可重用的代码。通过理解流和 lambda 的概念,我们可以提高整体编码技能并编写更高效的代码。

提高 Java 技能的一种有效方法是获得最新的 Java 认证并使用 MyExamCloud 上提供的 1Z0-830 练习测试。

版本声明 本文转载于:https://dev.to/myexamcloud/streams-and-lambdas-in-java-a-guide-to-functional-programming-with-examples-4cij?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-04-13
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在银光应用程序中,尝试使用LINQ建立错误的数据库连接的尝试,无法找到以查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中,tblpersoon可能需...
    编程 发布于2025-04-13
  • MySQL WHERE IN 子句如何使用ID数组?
    MySQL WHERE IN 子句如何使用ID数组?
    使用raray中的raray中QUERY mySQL的位置 步骤2:附加operator 步骤3:parameTerize values 使用准备好的语句或参数化query。 parameters.Example:SELECT * FROM galleriesSQL Query:WHERE id ...
    编程 发布于2025-04-13
  • 如何阻止网站图片被未授权下载?
    如何阻止网站图片被未授权下载?
    探索未经授权下载的最有效度量是避免在线发布它们,这可能总是可行的。假设有有限的漏洞水平,我们探索了其他技术,以阻碍图像下载并保障敏感或有价值的内容。一种常见的方法是在.gif或.png格式中使用透明的图像来叠加原始图像,从而从直接下载中掩盖了它。另一个选项涉及使用Background_image ...
    编程 发布于2025-04-13
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-04-13
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-04-13
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-04-13
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-04-13
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-04-13
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-13
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-04-13
  • Python数据序列化技巧,提升性能的终极指南
    Python数据序列化技巧,提升性能的终极指南
    [2 作为畅销书作者,我邀请您在亚马逊上探索我的书籍。 关注我进行媒介以获取更新并表示支持! 您的鼓励对我来说意味着世界! 1。协议缓冲区:结构化效率 中定义您的数据结构。 syntax = "proto3"; 消息人{ 字符串名称= 1; int32 age ...
    编程 发布于2025-04-13
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中可能会遇到一个冲突,其中3派对软件包将另一个带有导入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    编程 发布于2025-04-13
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-04-13
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-04-13

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

Copyright© 2022 湘ICP备2022001581号-3