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,一经查实,立即删除!

相关文章

面向对象克隆对象

克隆对象这种写法不是对象克隆&#xff0c;就是把obj的内存地址赋值给obj2. 通过for in克隆 不管是公有的还是私有的都克隆成私有的 Js提供了一个一个克隆的方法 Object.create() Var obj2Object.create(obj) 将obj的所有属性克隆到obj2的原型上 转载于:https://www.cnblogs.…

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;也就尤为重要。用户注册和登…

小程序支付及H5支付前端代码小结

小程序支付和H5支付前端都不需要引入其他的js , 只需要后台将相关的参数 &#xff08; timeStamp: , nonceStr: , package: , signType: MD5, paySign: , &#xff09; 返回来就可以发起微信支付。 小程序支付&#xff1a; wx.requestPayment({timeStamp: ,nonceStr: ,package:…

一道有意思的面试算法题

新年第一篇文章&#xff0c;先祝大家新年快乐&#xff01;&#xff01;那么接下来进入正文。 前言 前阵子突发奇想&#xff0c;突然开始刷leetcode。其中刷到了一道有意思的题目&#xff0c;发现这道题是当时秋招的时候&#xff0c;腾讯面试官曾经问过我的题目。于是分享给大家…

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

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

Javolution 2.2.5 - Java Struct/Union Simplified

Multi-dimensional arrays of struct/union or of primitive types are also supported. Struct API: http://javolution.org/api/javolution/io/Struct.html转载于:https://www.cnblogs.com/perlye/archive/2005/02/04/102192.html

function

function foo(){function bar(){return 3;}return bar();function bar(){return 8;}}1.这个函数返回的是8 function foo1(){var bar1function(){return 3;};return bar1();var bar1function(){return 8;}}2.这个函数返回是3 alert(foo2());function foo2(){var bar2function(){…

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…

计算机通识必修课程学什么内容,计算机通识课程教学平台研究与探索.doc

计算机通识课程教学平台研究与探索计算机通识课程教学平台研究与探索摘要&#xff1a;在全国推行教育信息化大背景下&#xff0c;对民办大学计算机类通识课程的教学进行系统定位&#xff0c;结合实际情况利用Moodle开源软件搭建网络教学平台&#xff0c;进而改革优化现有的课程…

CF908G New Year and Original Order

题面 题意翻译 给定$n<10^{700}$&#xff0c;问$1$到$n$中每个数在各数位排序后得到的数的和。答案$mod\;10^97$。 题解 考虑设$f[i][j][k][0/1]$表示前$i$位有$j$位的数字大小$\geq k$&#xff0c;是否严格小于$n$的方案数 转移时&#xff0c;枚举第$i1$位填$p$ $$ f[i1][j…

15必须阅读Java 8教程

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

json 对象 数组

一、json写法以及获得其数据的方法 var jsons{ name:wen, age:12, price:qq } console.log(typeof jsons);//object console.log(jsons.name);//wen 二、Array(也是数组) 创建数组方法1&#xff1a;var myArraynew Array(8);创建一个储存8个数据的数组 创建数组方法3:var a…

随机森林和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;爬虫技能是应…

在Spring中使用jOOQ:CRUD

jOOQ是一个库&#xff0c;可帮助我们重新控制SQL。 它可以从我们的数据库生成代码&#xff0c;并允许我们使用其流畅的API来构建类型安全的数据库查询。 本教程前面的部分向我们介绍了如何配置示例应用程序的应用程序上下文以及如何从数据库中生成代码。 现在&#xff0c;我们…

timeval的时间转换成毫秒之后多大的数据类型可以装下

struct timeval {long tv_sec; /*秒*/long tv_usec; /*微秒*/ }; 秒的定义为long&#xff0c;为了防止溢出&#xff0c;转换成毫秒之后保存在long long中转载于:https://www.cnblogs.com/AKUN-FYK/p/10981984.html

JuJu团队1月4号工作汇报

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

不知是福

很不喜欢自己的乌鸦嘴。我对很多的事情都有不好的预感&#xff0c;曾经以为那是我的消极观念所致&#xff0c;所以有时故意不去理会。待到许久之后&#xff0c;逐渐忘怀&#xff0c;所有的不好已经无所谓了…… 但是&#xff0c;有时偏偏过于好奇。正如昨天晚上。 因为好奇&…