Java 8的功能基础

Revolution_small Java 8彻底改变了Java。 它很可能是过去10年中最重要的Java版本。 有很多新功能,包括默认方法,方法和构造函数引用以及lambda, 仅举几例 。

更有趣的功能之一是新的java.util.stream API,正如Javadoc所述,该API支持

元素流上的函数式操作,例如集合上的map-reduce转换

将此新API与lambda表达式结合使用,您将获得简洁但功能强大的语法,该语法可通过应用投影显着简化代码。

以表面上简单的过滤集合为例。 在这种情况下,将创建一个简单的Message类型Collection ,如下所示:

创建消息集合

List<Message> messages = new ArrayList<>();
messages.add(new Message("aglover", "foo", 56854));
messages.add(new Message("aglover", "foo", 85));
messages.add(new Message("aglover", "bar", 9999));
messages.add(new Message("rsmith", "foo", 4564));

通过这个集合,我想过滤出Message ,其delay (第3个构造函数参数)大于3,000秒。

在Java 8之前 ,您可以像这样手动阻塞这种逻辑:

过滤旧派风格

for (Message message : messages) {if (message.delay > 3000) {System.out.println(message);}
}

但是,在Java 8中,此工作变得更加简洁。 集合现在支持stream方法,该方法将基础数据结构转换为可迭代的对象流,从而允许使用lambda表达式的新型功能操作。 这些操作大多数也可以链接在一起。 这些可链接的方法称为“ 中间” ,不能链接的方法称为“ 终端”

简而言之,lambda表达式与匿名类非常相似,只是语法更少 。 例如,如果您在Javadocs中查找Streamfilter方法的参数,则会看到它采用了Predicate类型。 但是,您不必像在使用匿名类的Java 8之前那样实现该接口。 因此,用于过滤所有大于3000的delay值的Predicate lambda表达式为:

Lambda表达式

x -> x.delay > 3000

其中, x是为流中的每个值传递的参数, ->右边的所有内容都是要求的表达式。

将所有这些放到Java 8中可以得出:

流lambdas!

messages.stream().filter(m -> m.delay > 3000).forEach(item -> System.out.println(item));

有趣的是,由于Java 8的其他一些新功能, forEach的lambda可以进一步简化为:

流lambda更短!

messages.stream().filter(m -> m.delay > 3000).forEach(System.out::println);

因为forEach lambda的参数仅由println ,所以Java 8现在允许您完全删除该参数。

之前,我提到过流允许您链接lambda-在上述情况下, filter方法是一种中间方法,而forEach是一种终端方法。 功能程序员可以立即识别的其他中间方法是: mapflatMapreduce ,仅举几例。

详细地说,我想查找所有延迟超过3,000秒的Message ,并总结总延迟时间。 没有功能魔术,我可以写:

普通的Java

long totalWaitTime = 0;
for (Message message : messages) {if (message.delay > 3000) {totalWaitTime += message.delay;}
}

不过,使用Java 8和一些function-foo,您可以实现更优雅的代码构造,如下所示:

Java 8优雅

long totWaitTime = messages.stream().filter(m -> m.delay > 3000).mapToLong(m -> m.delay).sum();

请注意,我如何链接filtermapToLong方法以及终端sum 。 顺便说一句, sum方法需要一种特定的地图样式方法,该方法可产生基本类型的集合,例如mapToLongmapToInt等。

功能样式编程作为一种核心语言功能,是一种非常强大的结构。 而且,尽管许多技术在诸如Guava之类的各种第三方库中以及诸如Scala和Groovy之类的JVM语言中已经可用,但拥有这些语言核心的这些功能肯定会吸引更多的开发人员,并对开发前景产生最大的影响。

毫无疑问,Java 8极大地改变了Java语言 。

翻译自: https://www.javacodegeeks.com/2014/03/java-8s-functional-fomentation.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSON.stringify()和JOSN.parse()

JSON.stringify()跟JSON.parse() 终于把这两个方法搞清楚了&#xff01;&#xff01;&#xff01; JSON.tringify()&#xff1a;把一个json数据转化成JSON string JSON.stringify({uno:1,dos:2},null,\t)"{"uno": 1,"dos": 2}"JSON.stringfy({u…

查表法实现反正切_关于python实现CRC32的应用和总结

关于python实现CRC32的应用和总结目前使用的Crc计算包含Crc32和Crc32mpeg2两种计算方式。循环冗余检验 CRC 差错检测技术能够证明数据是完整的&#xff0c;是无差错的&#xff08;只是非常近似的认为是无差错的&#xff09;。保证数据可靠性传输的方法包含如下&#xff1a;检验…

bootstrap html5 表单验证,基于Bootstrap+jQuery.validate实现表单验证

这大概是一种惯例&#xff0c;学习前台后台最开始接触的业务都是用户注册和登录。现在社会坚持以人为本的理念&#xff0c;在网站开发过程同样如此。User是我们面对较多的对象&#xff0c;也是较核心的对象。最开始的用户注册和登陆这块&#xff0c;也就尤为重要。用户注册和登…

JavaFX技巧1:可调整大小的Canvas

在使用FlexGanttFX时&#xff0c;我不得不处理很多JavaFX Canvas节点。 我正在使用它在时间轴上呈现活动。 甘特图中的每一行都是一个Canvas节点。 用户可以选择单独调整每行的大小。 因此&#xff0c;我不得不找出调整画布大小的最佳方法&#xff0c;这种现成的方法无法调整大…

12日疯人认证百度云_12月15日上海实习汇总(百度、美图、哔哩哔哩等)

上海实习实习汇总 | 实习内推 | 寒假实习博世 采购助理Job Title: 采购部实习生Job Description:1. Create Purchase Decision (PD), initiate internal approval workflow.2. Maintain basic data in SAP, SupplyOn, SRM, internal system Pilum .etc.3. Issue purchase order…

15必须阅读Java 8教程

Java 8于上个月发布&#xff0c;其中充满了新功能和幕后优化。 互联网在覆盖所有这些新增加的方面&#xff08;包括好的和坏的&#xff09;一直做得很好。 我认为最好汇总一下我们认为是最好的一些教程&#xff0c;以帮助您快速掌握最新信息和需要了解的知识。 Java 8新功能列…

随机森林和gbdt结合_决策树与迭代决策树(GBDT)

关注数学&#xff0c;关注AI&#xff0c;关注我们公众号ID&#xff1a;Math-AI阅读目录1. 决策树的模型2. 决策树的基本知识3. ID3、C4.5&CART4. Random Forest5. GBDT6. 参考内容今天我们来谈一谈机器学习算法中的各种树形算法&#xff0c;包括ID3、C4.5、CART以及基于集成…

猫眼html源码,50 行代码教你爬取猫眼电影 TOP100 榜所有信息

点击上方“CSDN”&#xff0c;选择“置顶公众号”关键时刻&#xff0c;第一时间送达&#xff01;今天&#xff0c;手把手教你入门 Python 爬虫&#xff0c;爬取猫眼电影 TOP100 榜信息。作者 | 丁彦军本文经授权转自「程序人生」对于 Python 初学者来说&#xff0c;爬虫技能是应…

JuJu团队1月4号工作汇报

JuJu团队1月4号工作汇报 JuJu Scrum 团队成员今日工作剩余任务困难飞飞将model嵌入GUI美化UI无婷婷调试代码提升acc无恩升--写python版本的evaluate.jl无金华修改loader待安排无胡凯--考试无陈灿协调协调无PM报告 整个项目的任务量预期为250 people*hour&#xff0c; 目前已经解…

大数据技术与应用实训心得_GXCGQ16D传感器与检测技术应用实训考核设备

(一)产品概述依据国家人力资源与社会保障部《技工院校工学结合课程教学改革试点工作方案》设计&#xff0c;围绕典型工作任务(即传感器实训模块)确定课程目标&#xff0c;选择课程内容&#xff0c;制定专业教学计划&#xff0c;根据国家职业标准中相关内容。将机电工学结合中有…

IIS 7.5绑定中文域名转码启动站点报“值不在预期的范围内”

问题现象 IIS 7.5在绑定中文域名转码后&#xff0c;启动站点会出现【值不在预期的范围内】&#xff1a; 解决方案此问题是由于中文域名绑定错误导致的&#xff0c;IIS 7.5针对中文域名会自动转换为punycode码&#xff0c;所以不需要绑定punycode码&#xff0c;如果要绑定中文域…

if判断代码 转变为 流程图

转换规则如下&#xff1a; if 代表一个菱形问号 if后面的条件代表菱形里的内容↓yes&#xff08;向下箭头和yes&#xff09; if同级的else代表右拐向下箭头和no 执行语句块代表一个矩形。 if 今天发工资:先还信用卡的钱if 有剩余:又可以happy了&#xff0c;O(∩_∩)O哈哈~else:…

刷新问题

最近新建立了一个MDI多文档工程,但不知道是何原因,只打开MDI父窗体进行界面界面就已经刷新不过来了,如果界面大小变化,更是不堪忍受,不知道是什么原因,而且我已经把窗体设置了不透明.页面的控件都变成模糊的,看不清,如下,请大家帮忙解决.转载于:https://www.cnblogs.com/bluecl…

jenkins修改pom文件_动手实践:美化 Jenkins 报告插件的用户界面

对于 Jenkins 而言&#xff0c;可使用插件来可视化各种构建步骤的结果。有一些插件可用于呈现测试结果、代码覆盖率、静态分析等。这些插件通常都会获取给定构建步骤的构建结果&#xff0c;并在用户界面中显示它们。为了呈现这些细节&#xff0c;大多数插件使用静态 HTML 页面&…

01:saltstack 基本使用

目录&#xff1a;zabbix其他篇 01&#xff1a;saltstack 基本使用 02&#xff1a;saltstack-api使用详解 目录&#xff1a; 1.1 准备实验环境: 安装系统1.2 克隆一台虚拟机完成使用环境1.3 saltstack介绍1.4 saltstack安装 1.5 saltstack常用模块 1.6 salt ssh详解 1.7 Salt Gr…

matlab批量修改txt内容_MATLAB作图实例:18:为饼图添加文本标签和百分比

创建饼图时&#xff0c;MATLAB会用切片所代表的整个饼图的百分比来标记每个饼图切片。您可以更改标签以显示不同的文本。简单文字标签用简单的文本标签创建一个饼图。x [1,2,3];pie(x,{Item A,Item B,Item C})带有百分比和文本的标签创建带有包含自定义文本和每个切片的预先计…

python 怎么算l2范数_数学推导+纯Python实现机器学习算法13:Lasso回归

版权说明&#xff1a;本公号转载文章旨在学习交流&#xff0c;不用于任何商业用途&#xff0c;版权归原作者所有&#xff0c;如有异议&#xff0c;敬请后台联络我们&#xff0c;议定合作或删除&#xff0c;我们将第一时间按版权法规定妥善处理&#xff0c;非常感谢&#xff01;…

Java 8快多少?

Java SE 8已于昨天发布 。 传统上&#xff0c;每个新的主要JRE版本都提供免费的性能提升。 我们还能再得到免费的午餐吗&#xff1f; 这次收益有多大&#xff1f; 让我们对其进行基准测试。 基准方法 使用3个不同的JRE版本&#xff08;SunJDK 1.6.0_26 &#xff0c;OpenJDK 1…

Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误...

今天因为想要用OpenCV做图像识别&#xff0c;小白一个&#xff0c;在网上找到一个教程&#xff0c;但是需要配置OpenCV3.3.0的环境&#xff0c;于是又在网上找OpenCV3.3.0VS2013&#xff08;因为我之前已经安过了VS2013&#xff09;&#xff0c;前面的都顺利执行&#xff0c;但…

mvp的全称_是让人提神醒脑的 MVP、MVVM 关系精讲!

前言很高兴见到你&#xff01;我是《Jetpack MVVM 精讲》的独立原创作者 KunMinX&#xff0c;GitHub star 8.7k&#xff0c;专注于深度思考和 Jetpack MVVM 的分享。关于 MVP 和 MVVM 本质和区别的文章&#xff0c;本来我是不想写的&#xff0c;因为经过长达一年的耳濡目染 和对…