JavaOne 2012:Lambda之路

我最热切期待的JavaOne 2012演讲之一是Brian Goetz的“通往Lambda的道路”。 昨晚的技术主题演讲中的Lambda味道仅增加了预期。 这是在希尔顿广场A / B举行的,距离我上次在金门大桥A / B / C参加的演讲仅几步之遥。 我原本希望打包相对较大的Plaza A / B(仅位于客厅),但是空座位却比我预期的要多得多。

Goetz开始谈论Java 8处于“成熟阶段”,但尚未发布或准备交付。 他说,他希望Java 8和Lambda能够在明年这个时候上市。 Goetz说,“您可以编写任何值得使用Java编写的程序”,但是Java 8将使编写此程序变得更加容易。 他的幻灯片“现代化Java”谈到Java SE 8“现代化Java语言”和“现代化Java库”。 他在幻灯片上的最后一句话说:“这也许是Java编程模型有史以来最大的升级 。” 这就是我的感觉,这就是为什么我对这次演讲没有得到更好的参与感到惊讶的部分原因。

Goetz表示lambda表达式是“匿名方法”。 除了名称之外,它具有方法具有的所有内容(参数列表,返回类型和主体)。 它允许您将代码视为数据 。 方法参考引用现有方法。 Goetz重申,由于添加了lambda表达式,将导致向编写和使用库的巨大根本转变。

Goetz指出,Java于1995年问世时,大多数语言都没有闭包,但是如今,除Java之外的大多数语言都具有闭包。 然后,他在名为“ Java的封闭-漫长而曲折的道路”的幻灯片中总结了Java封闭的一些历史。 他引用Odersky的年代和Wadler 1997年的“比萨”(1997年),Java 1.1中的内部类(1997),以及2006 - 2008年“ 轰轰烈烈的社会辩论关于关闭 ”(包括BGGA和CICE )。 Lambda项目成立于2009年12月,相关的JSR 335于2010年11月提交。今天,它“相当接近完成”。

Goetz指出,for循环“对于当今的硬件已过度指定”,同时描述了与我们今天经常使用的“外部迭代”的使用相关的“意外复杂性”。 我同意他的观点,即“ foreach循环隐藏了客户端和库之间的复杂交互”。

lambda表达式的目标允许将“如何”从客户端移至库。 Goetz强调说,这不仅仅是语法上的更改,因为该库受lambda表达式控制,并且是内部迭代 。 Goetz表示:“客户处理“什么”,而图书馆处理“如何”,那是一件好事。” 他补充说,lambda表达式对我们的编码方式尤其是对我们开发库的方式具有深远的影响。

Goetz讨论了使用新的Java接口默认实现机制将新的forEach(Block)方法添加到集合中的方法。 Goetz区分了Java一直具有类型的多重继承(可以实现多个接口),现在(Java 8)将具有行为的多重继承(可用于接口的默认方法实现),但仍然不会具有状态的多重继承(他将其描述为最危险的)。 戈茨有一张幻灯片专门用来解释当您从多重继承中取出日期(状态)时为什么“ 钻石容易”。

Goetz的幻灯片很好,总结了“默认方法-继承规则”。 这张幻灯片介绍了三个规则。 他指出,“如果无法通过规则解决默认问题,则子类必须实现它。” Goetz指出,接口可以提供“弱”的默认实现,而子类可以提供更好的实现。

接口上默认方法的另一个优点是,默认实现可以为可选方法引发异常(例如UnsupportedOperationException ),这样,未实现可选行为的子类就无需执行其他任何操作。 Goetz还展示了Lambda表达式如何使Comparator可以添加reverse()和compose()方法。

Goetz展示了一些代码示例,这些示例说明了lambda表达式允许使用“更干净”和“更自然”的表示形式。 用他的话说,由于lambda表达式驱动的操作具有可组合性,因此“代码读起来就像问题声明”。 客户端中也没有任何可变状态。

我计划将来在Goetz的一张幻灯片中引用一句话:“懒惰可以更有效。” 这样的上下文是,如果您不打算使用所有结果,那么懒惰会更有效,因为一旦确定了匹配项,您就可以停止寻找。 流操作要么是中间的(延迟),要么是最终的(自然而然)。

Stream是一种引入的抽象,允许添加批量操作,并且“表示值的流”。 Goetz的项目符号警告说,Stream是“不是数据结构”并且“不存储值”。 这样做的目的是避免在设置过程中产生噪音,并尝试更加“流畅”。

格茨表示,“ Java的朋友之一一直是库。” 他谈到了lambda表达式如何在Java库中实现更大的并行度。 Goetz表示fork-join功能强大,但不一定易于使用。 Goetz强调:“编写串行代码很容易; 编写并行代码真是麻烦。” Lambda表达式仍然需要并行性才能明确,但对于lambda表达式及其对库的影响应不加干扰。

为了强调Project Lambda对库中并行性的影响,Goetz展示了一个令人痛苦的幻灯片,其中介绍了今天如何使用fork-join与集合进行并行求和,然后另一个幻灯片显示了lambda表达式的使用更加简单。 重点是:带有lambda表达式的代码要少得多,从而使业务逻辑在整个代码中所占的比例更大。

格茨(Goetz)将Spliterator称为“ Iterator的并行模拟”。 拆分器的规定行为可用于任何知道如何拆分自身的对象( Spliterable )。

幻灯片“ Lambdas支持更好的API”使lambda表达式对标准Java API产生了强大而受欢迎的效果。 他强调,“对API的关键影响是可组合性

Goetz表示,出于多种原因(例如成本更低,风险更低等),我们通常更喜欢通过库而不是语言语法来发展编程模型。他在总结演讲时指出,时代已经改变,而Java不再支持闭包。

一位与会者询问为什么lambda表达式方法支持是在集合上而不是迭代器上。 Goetz表示,尽管C#确实从迭代器方法开始使用它,但他的团队发现,对于开发人员而言,在集合上而不是在迭代器上使用方法的混乱程度降低了。

在回答另一个问题时,Goetz表示,由于其复杂性,尚无法对lambda表达式进行反思。 为了回答另一个问题,Goetz表示,lambda表达式支持是使用invokedynamic和方法handle构建的。 这是使lambda表达式“易于编程”和“快速”的一部分工作。

另一个问题引起了Goetz的一个非常有趣的回答,其中Goetz解释说,集合本身内部迭代的可用性意味着更少的人(库开发人员而不是最终用户开发人员)将会遇到迭代复杂性。 Goetz鼓励与会者运行当前可用的Java 8 drop,以帮助确定Lambda表达式是否得到正确处理。 Goetz表示:“我们从社区中获得的最有价值的贡献是人们说,'我尝试了一下,发现了这个bug。”

Goetz在开始此演示时指出,这是在以前的JavaOne会议和其他有关lambda状态的会议中的一连串演讲。 但是,与此不同的是,Lambda项目“几乎在那儿”,考虑到这一点,似乎语法和概念在很大程度上已经就位。 欢迎对API和语法进行这种明显的固化,并且此演示文稿满足了我对此的很高期望。

别忘了分享!

参考: JavaOne 2012:Lambda之路,来自JCG合作伙伴 Dustin Marx, 来自Inspired by Actual Events博客。


翻译自: https://www.javacodegeeks.com/2012/10/javaone-2012-road-to-lambda.html

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

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

相关文章

沉浸式go-cache源码阅读!

大家好,我是豆小匠。 这期来阅读go-cache的源码,了解本地缓存的实现方式,同时掌握一些阅读源码的技巧~ 1. 源码获取 git clone https://github.com/patrickmn/go-cache.git用Goland打开可以看到真正实现功能的也就两个go文件,ca…

CoreAnimation 变换

CoreAnimation 变换 CoreAnimation 目录 博客园MakeDown支持不佳,如有需要请进GitHub 本片博客主要内容: 仿射变换 - CGAffineTransform3D变换 - CATransform3D仿射变换 - CGAffineTransform CGAffineTransform 是用于二维空间的旋转,缩放和平移的属性.首先展示一个简单的样例,…

20170907wdVBA_GetCellsContentToExcel

WORD 加载项 代码模板 Dim cmdBar As CommandBar, cmdBtn As CommandBarControl Const cmdBtnCap As String "批量提取操作步骤"Sub AutoExec()Call DelCmdBtnCall AddCmdBtnEnd Sub Sub AutoExit()Call DelCmdBtn End SubSub AddCmdBtn()Set cmdBar Application.C…

mysql 5.7 mirror_Centos7 Docker离线部署Mysql5.7

1 环境信息查看系统内核[rootlocalhost /]# cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core)2 虚拟机拉取镜像此处资源获取在虚拟机中进行,完成后上传到服务器安装2.1 拉取mysql5.7镜像[rootlocalhost /]# docker pull mysql:5.72.2 导出镜像[rootloc…

Java中的简单REST客户端

如今,大多数用于与某些服务器通信的移动应用程序都使用REST服务。 这些服务也是与JavaScript或jQuery一起使用的常见做法。 现在,我知道在Java中为REST服务创建客户端的2种方法,在本文中,我将尝试演示这两种方法,希望它…

3.20 下午

阅读《艺术学概论》 戏剧冲突是戏剧的灵魂 冲突包括:人物性格的冲突、行为的冲突、 思想感情的冲突乃至心理状态的冲突等等 转载于:https://www.cnblogs.com/bgd140206110/p/6590005.html

华为root工具_华为Mate9解锁后无法ROOT 需要手动刷入Recovery怎么办【解决方法】...

很多朋友手机到手之后,都希望能够ROOT使用更多的系统功能。近日有网友向小编询问,为何华为Mate9解锁后无法ROOT,明明已经通过官方的解锁教程解锁的,但是之后使用“大师”等第三方刷机工具,无法ROOT。其实ROOT的关键就在…

JAX-WS入门

JAX-WS代表XML Web Services的Java API。 它是一种Java编程语言API,用于创建Web服务和使用XML进行通信的客户端。 这篇文章是JAX-WS的快速入门。 先决条件 GlassFish与Eclipse集成在一起 。 创建JAX-WS Web服务 1.在Eclipse中创建一个名为“ com.eviac.blog.jax…

canvas 图片反色

代码实例&#xff1a; <!DOCTYPE HTML> <html> <head><meta charset"utf-8"><title>图片反色</title><style type"text/css">body{ background:black;}#c1{ background:white;}</style><script type&q…

python中的文件父路径怎么表达_python中的文件父路径怎么表达_如何在Python中访问父目录...

所以我有一个朋友给我的Python脚本&#xff0c;但是我没有Python的经验。代码如下&#xff1a;from os import path, chdir, listdir, mkdir, getcwdfrom sys import argvfrom zipfile import ZipFilefrom time import sleep#Defines what extensions to look for within the f…

Maven的中央仓库地址

www.mvnrepository.com转载于:https://www.cnblogs.com/j-liu3323/p/6590435.html

Spring–添加AOP支持

我听到了一个有关一位高级&#xff08;且酬劳颇丰&#xff09;软件工程师的故事。 他的任务是记录他正在研究的项目中每个控制器中的每个方法。 工程师重写了所有控制器方法&#xff0c;因此使用如下代码&#xff1a; RequestMapping(method RequestMethod.GET)public String …

vscode python第三方库检测_VSCode中使用Pylint检查python代码

为什么使用lint在日常开发中&#xff0c;不同开发人员会写下不同风格的代码&#xff0c;导致代码可维护性变差&#xff0c;为了解决风格不一致问题&#xff0c;我们可以制定代码规范&#xff0c;让开发人员都遵守同样的规范编写代码。在开发过程中&#xff0c;部分代码存在质量…

Spring MVC-集成(Integration)-集成LOG4J示例(转载实践)

以下内容翻译自&#xff1a;https://www.tutorialspoint.com/springmvc/springmvc_log4j.htm 说明&#xff1a;示例基于Spring MVC 4.1.6。 以下示例说明如何使用Spring Web MVC框架来触发LOG4J。首先&#xff0c;让我们使用Eclipse IDE&#xff0c;并按照以下步骤使用Spring W…

NUMA架构和Java

是时候部署您的应用程序了&#xff0c;期待着采购最适合负载要求的硬件。 如今&#xff0c;具有40核或80核的包装盒非常普遍。 总体概念是更多的内核&#xff0c;更多的处理能力&#xff0c;更多的吞吐量。 但是我看到了一些相反的结果&#xff0c;表明小型的CPU密集型测试运行…

存储过程常用技巧

我们在进行pl/sql编程时打交道最多的就是存储过程了。存储过程的结构是非常的简单的&#xff0c;我们在这里除了学习存储过程的基本结构外&#xff0c;还会学习编写存储过程时相关的一些实用的知识。如&#xff1a;游标的处理&#xff0c;异常的处理&#xff0c;集合的选择等等…

vue是用a标签打开新页面_vue 在新窗口打开页面并设置不同的背景

开发一个新系统&#xff0c;前端用的vue&#xff0c;vue是单体应用&#xff0c;所有页面都在一个窗口里实现&#xff0c;但项目要求在点button链接后要新打开一个浏览器页面&#xff0c;解决方法如下&#xff1a;1. 给此button设置新事件 click"createdefect"提交缺陷…

卡尔曼滤波的推导

卡尔曼滤波的推导1 最小二乘法在一个线性系统中&#xff0c;若\(x\)为常量&#xff0c;是我们要估计的量&#xff0c;关于\(x\)的观测方程如下&#xff1a; \[ y Hx v \tag{1.1}\] \(H\)是观测矩阵&#xff08;或者说算符&#xff09;&#xff0c;\(v\)是噪音&#xff0c;\(y…

Java注释-保留

考虑一下Java批注&#xff1a; public interface AnAnnotaton {}带有此注释的类&#xff1a; AnAnnotaton class AnAnnotatedClass{}还有一个测试&#xff0c;检查类中是否存在此批注&#xff1a; import static org.hamcrest.MatcherAssert.assertThat; import static org.h…

MYSQL查询选修三门以上课程_SQL高级查询的练习题

Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表问题&#xff1a;1、查询“001”课程比“002”课程成绩高的所有学生的学号&#xff1b;select a.S# from (select s#,score from SC where C#001) a,(select s#,s…