Devoxx 2012:Java 8 Lambda和并行性,第1部分

总览

Devoxx是世界上最大的独立于供应商的Java会议,于11月12日至16日在比利时的Atwerp举行。 今年规模更大了,来自40个不同国家的3400名与会者。 和去年一样 ,我和来自SAP的一小群同事都来了,并享受了很多。

在Nao机器人令人印象深刻的舞蹈和开幕主题演讲之后,超过200场会议探讨了从Java SE到方法论和机器人技术的各种不同技术领域。 对我而言,最有趣的主题之一是JDK 8中Java语言和平台的演变。
我之所以感兴趣,部分原因是我已经开始在Wordcounter上工作,并在另一个并发的Java库Evictor上完成工作,我将在以后的博客中发表有关该库的博客。 在本博客系列中,我想分享一些我参加过的有关此主题的会议的更详细的摘要。 这三个会话都在同一天,同一房间,一个接一个的空间中进行,共同为Java 8中的lambda,并行集合和并行性提供了三种不同的观点。

  • 在通往JDK 8的路上:Lambda,并行库等,作者Joe Darcy
  • 封闭与收藏–莫里斯·纳夫塔林(Maurice Naftalin)的《八点后的世界》
  • Fork / Join,lambda和parallel(): Jose Paumard简化了并行计算(太容易了)

在这篇文章中,我将介绍第一届会议,其他两届会议即将举行。

通往JDK 8的道路上:Lambda,并行库等

在第一届会议上,Oracle多个项目的首席工程师Joe Darcy介绍了JDK 8中所用语言的关键更改,例如lambda表达式和默认方法,总结了实现方法,并研究了并行库及其新特性。编程模型。 本次会议的幻灯片可在此处获得 。

不断发展的Java平台

乔首先谈到了上下文和与语言发展有关的关注。
OpenJDK的一般演变策略是:

  • 不要破坏二进制兼容性
  • 避免引入源不兼容性。
  • 管理行为兼容性更改

上面的列表还扩展到语言的发展。 这些规则意味着将始终识别旧的类文件,限制当前合法代码停止编译的情况,并且还避免了生成的代码中引入行为更改的更改。 该策略的目标是保持现有二进制文件的链接和运行,并保持现有源代码的编译。

这也影响了选择要在语言本身中实现的功能集以及它们的实现方式。 在向Java添加闭包时,此类担忧也有效。 例如,接口是一把双刃剑。 利用我们今天拥有的语言功能,它们无法随着时间的推移而兼容发展。 但是,在现实中,随着人们对API的期望的提高,API逐渐发展。 在语言中添加闭包会导致一个完全不同的编程模型,这意味着如果可以兼容地扩展接口,那将非常有帮助。 这导致更改同时影响语言和VM,称为default methods

Lambda项目

Lambda项目引入了协调的语言,库和VM更改。 在该语言中,有lambda expressions和默认方法。 在库中,有bulk operations on collections以及对并行性的附加支持。 在虚拟机中,除默认方法外,还对invokedynamic功能进行了增强。 这是对语言所做的最大更改,比泛型等其他重大更改要大。

什么是lambda表达式?

lambda expression是一种匿名方法,具有一个参数列表,一个返回类型和一个主体,并且能够从封闭范围引用值:

(Object o) -> o.toString()
(Person p) -> p.getName().equals(name)

除了lambda表达式外,还有method reference语法:

Object::toString()

lambda的主要好处是它允许程序员将代码视为数据,将其存储在变量中并将其传递给方法。

一些历史

在1995年首次引入Java时,没有多少种语言具有闭包功能,但如今,几乎所有主流语言都使用闭包语言,甚至C ++也是如此。 对于Java来说,获得关闭支持一直是一条漫长而曲折的道路,直到Lambda项目最终于2009年12月开始。目前的状态是JSR 335处于早期草稿审查中 ,有可用的二进制版本 ,并且有望成为很快,JDK 8主线的一部分就会构建。

内部和外部迭代

有两种执行迭代的方法–内部和外部。 在external iteration您将数据带入代码,而在internal iteration您将代码带入数据。 外部迭代就是我们今天所拥有的,例如:

for (Shape s : shapes) {if (s.getColor() == RED)s.setColor(BLUE);
}

这种方法有几个局限性。 其中之一是上述循环inherently sequential上是inherently sequential ,即使没有根本原因不能由多个线程执行,也是如此。

重新编写以对lambda使用内部迭代,上面的代码将是:

shapes.forEach(s -> {if (s.getColor() == RED)s.setColor(BLUE);
})

这不仅是语法上的更改,因为现在该库可以控制迭代的发生方式。 以这种方式编写的代码表达的内容更多what而更少, how ,如何留给库。 库作者可以自由使用并行性,乱序执行,懒惰和所有其他技术。 这允许库对行为进行抽象,这从根本上是一种更强大的处理方式。

功能介面

Lambda项目避免了添加新类型,而是重用了现有的编码实践。 Java程序员熟悉并长期使用一种方法(如RunnableComparatorActionListener使用接口。 这些接口现在称为functional interfaces 。 还将有新的功能接口,例如PredicateBlock 。 Lambda表达式求值为功能接口的实例,例如:

PredicateisEmpty = s -> s.isEmpty();
Predicate isEmpty = String::isEmpty;
Runnable r = () -> { System.out.println(“Boo!”) };

因此,现有库与lambda向前兼容,从而导致“自动升级”,从而保持了对这些库的大量投资。

默认方法

上面的示例在Collection上使用了新方法forEach 。 但是,将方法添加到现有接口在Java中是不行的,因为当客户端在未实现该方法的旧类上调用新方法时,它将导致运行时异常。

default method是具有实现的接口方法,该实现由VM在链接时编织。 从某种意义上说,这是multiple inheritance ,但是没有理由惊慌,因为这是behavior多重继承,而不是状态的多重继承。 语法如下所示:

interface Collection<T> {...default void forEach(Block<T> action) {for (T t : this)action.apply(t);}
}

有某些inheritance rules可以解决多个超类型之间的冲突:

  • 规则1 –首选超类方法而不是接口方法(“类获胜”)
  • 规则2 –倾向于使用更具体的接口,而不是更少的接口(“子类型获胜”)
  • 规则3 –否则,就好像该方法是抽象方法一样。 在默认值冲突的情况下,具体类必须提供一个实现。

总之,通过寻找uniquemost specific default-providing interface来解决冲突。 有了这些规则,“钻石”就不成问题了。 在最坏的情况下,如果没有唯一,最具体的方法实现,则子类必须提供一个方法,否则会出现编译器错误。 如果此实现需要调用继承的实现之一,则此新语法为A.super.m()

默认方法的主要目标是API演变,但它们本身也可用作继承机制。 从中受益的另一种方法是optional methods 。 例如,大多数Iterator实现都没有提供有用的remove() ,因此可以将其声明为“可选”,如下所示:

interface Iterator<T> {...default void remove() {throw new UnsupportedOperationException();}
}

对集合进行批量操作

对集合执行批量操作还可以实现映射/简化编程风格。 例如,可以通过从shapes集合中获取stream ,过滤红色元素然后仅对过滤后的元素进行迭代来进一步分解以上代码:

shapes.stream().filter(s -> s.getColor() == RED).forEach(s -> { s.setColor(BLUE); });

上面的代码与您实际想要完成的问题的陈述更为接近。 还有其他有用的批量操作,例如mapintosum 。 该编程模型的主要优点是:

  • 更具可组合性
  • 清晰–每个阶段都做一件事
  • 该库可以使用并行性,乱序,惰性来提高性能等。

stream是添加到平台的基本的新抽象。 它封装了laziness ,以更好地替代诸如LazyList类的“惰性”集合。 它是一种允许从其中获取元素序列的工具,其源是集合,数组或函数。 具有流的基本编程模型是管道的模型,例如collection-filter-map-sumarray-map-sorted-forEach 。 由于流是惰性的,因此它们仅根据需要的元素进行计算,这在filter-map-findFirst类的情况下会filter-map-findFirst

流的另一个优点是,通过让库在后台使用fork / join来简化编程并避免样板,它们允许利用fork / join并行性。

实施技术

在演讲的最后一部分,乔描述了可能的lambda表达式实现技术的优缺点。 考虑了不同的选项,例如内部类和方法句柄,但由于它们的缺点而未被接受。 最好的解决方案是添加一个间接级别,方法是让编译器发出声明性配方(而不是命令性代码)以创建lambda,然后让运行时以它认为合适的方式执行该配方(并确保它是快速的)。

这听起来像是invokedynamic的工作,它是Java SE 7引入的一种全新的调用模式,其原因完全不同-支持JVM上的动态语言。 事实证明,此功能不再仅适用于动态语言,因为它为lambda提供了合适的实现机制,并且在性能方面也要好得多。

结论

Lambda项目是跨Java语言和平台的大型协调更新。 它为集合提供了更强大的编程模型,并利用了VM中的新功能。 您可以通过下载具有lambda支持的JDK8构建来评估这些新功能。 具有Lambda支持的NetBeans构建和具有Lambda支持的 IntelliJ IDEA 12 EAP构建中也已经提供了IDE 支持 。

我已经在Wordcounter中使用Java中的lambda进行了自己的体验。 正如我已经写过的,我坚信这种编程风格将很快在Java中普及,因此,如果您还没有使用它的经验,我鼓励您尝试一下。

参考: Devoxx 2012:Java 8 Lambda和Parallelism,第1部分,来自我们的JCG合作伙伴 Stoyan Rachev,位于Stoyan Rachev的Blog博客上。

翻译自: https://www.javacodegeeks.com/2012/12/devoxx-2012-java-8-lambda-and-parallelism-part-1.html

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

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

相关文章

前端常见的十七个框架

本文作者祈澈姑娘&#xff0c;转载请声明 前端的技术日渐更新&#xff0c;最近得空&#xff0c;花了一上午的时间&#xff0c;将前端常见的框架总结了一下&#xff0c;在开发的过程之中&#xff0c;有了这些&#xff0c;不断能够提高自己的工作效率&#xff0c;还可以在工作之余…

Cesium调用Geoserver发布的 WMS、WFS服务

1 GeoServer服务发布 1.1 WMS服务 下载GeoServer安装版安装&#xff0c;同时安装geopackage扩展&#xff0c;以备使用。使用XX地图下载器下载地图&#xff0c;导出成GeoPackage地图文件。 &#xff08;1&#xff09;下载 GeoPackage DEM数据 &#xff08;2&#xff09;打开GeoS…

如何用ThreadLocals射击自己

它将很好地启动。 像大多数故事一样。 您会发现一个新概念&#xff0c;并对其功能感到惊讶。 然后突然装备了这把新锤子&#xff0c;一切开始看起来像钉子。 根据我们过去几个月的经验&#xff0c; java.lang.ThreadLocal真是一锤定音。 我想这全都归结为ThreadLocal的工作原理…

确保任务的执行顺序

有时有必要对线程池中的任务施加一定的顺序。 JavaSpecialists通讯的第206期提出了一种这样的情况&#xff1a;我们有多个连接&#xff0c;使用NIO可以从中读取。 我们需要确保给定连接中的事件按顺序执行&#xff0c;但是不同连接之间的事件可以自由混合。 我想提出一个类似但…

transition

一、语法 transition: property duration timing-function delay transition属性是个复合属性&#xff0c;她包括以下几个子属性&#xff1a; transition-property &#xff1a;规定设置过渡效果的css属性名称transition-duration &#xff1a;规定完成过渡效果需要多少秒或…

图解在VC里使用graphics.h画图(相似TC)

1 www.easyx.cn 下载 EasyX 库 我下的2014;解压后例如以下图&#xff1b; 2 依据自己的VC 版本号进行安装 3 在控制台画一个圆 #include <graphics.h> // 引用图形库 #include <conio.h> void main() {initgraph(640, 480); // 初始化画图窗体circle(200, 200, 100…

使用SwingWorker的Java Swing中的多线程

如果要使用Swing用J​​ava编写桌面或Java Web Start程序&#xff0c;您可能会觉得需要通过创建自己的线程在后台运行某些东西。 没有什么可以阻止您在Swing中使用标准的多线程技术&#xff0c;并且需要遵循通常的注意事项。 如果您有多个线程访问相同的变量&#xff0c;则需要…

MySql Jar 包下载

MySql JAR 包下载 我们要使用Spring 链接MySql 需要两个Jar 包 一个是C3p0 一个是MySql 的Connection Jar 包 C3p0&#xff1a; 进入下面的网址 http://www.mchange.com/projects/c3p0/ 按照黄色的指示 下载 2. MySql Jar 包 进入MySql 官网 https://dev.mysql.com/down…

c语言以空格分割字符串_c语言中,输入任意字符串,任意空格隔开

c语言中,输入任意字符串,任意空格隔开关注:132 答案:3 mip版解决时间 2021-01-27 16:01提问者更无风月2021-01-27 01:51如题,希望大神代码最佳答案二级知识专家闪光的男人2021-01-27 02:50用scanf以%s读入字符串&#xff0c;即可实现输入以空格分隔的字符串。以下代码功能为&…

Unity经典游戏教程之:是男人就下100层

版权声明&#xff1a; 本文原创发布于博客园"优梦创客"的博客空间&#xff08;网址&#xff1a;http://www.cnblogs.com/raymondking123/&#xff09;以及微信公众号"优梦创客"&#xff08;微信号&#xff1a;unitymaker&#xff09;您可以自由转载&#x…

Html和websocket初识

一、web框架 众所周知&#xff0c;对于所有的Web应用&#xff0c;本质上其实就是一个socket服务端&#xff0c;用户的浏览器其实就是一个socket客户端。 import socketdef handle_request(client):buf client.recv(1024)client.send(b"HTTP/1.1 200 OK\r\n\r\n")cli…

java lombok 视频_Java开发神器Lombok使用详解

最近正在写SpringBoot系列文章和录制视频教程&#xff0c;每次都要重复写一些Getter/Setter、构造器方法、字符串输出的ToString方法和Equals/HashCode方法等。甚是浪费时间&#xff0c;也影响代码的可读性。因此&#xff0c;今天就给大家推荐一款Java开发神器——Lombok&#…

11-[函数进阶]-闭包

1.什么是闭包&#xff1f; 内部函数对外部函数作用域里变量的引用&#xff08;非全局变量&#xff09;&#xff0c;则称内部函数为闭包。 def outer():n 10def inner():print("inner:", n)return innerval outer() print(val) val() 闭包的意义&#xff1a;返回的…

CSS实现单行、多行文本溢出显示省略号(…)

如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来&#xff0c;当然还需要加宽度width属来兼容部分浏览。 实现方法&#xff1a; overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 效果如图&#xff1a; 但是这个属性只支持单行…

显示日历的指令:cal

1.显示日历的指令&#xff1a;cal &#xff08;1&#xff09;参数&#xff1a; &#xff08;2&#xff09;实例&#xff1a; 转载于:https://www.cnblogs.com/yfacesclub/p/8434449.html

简单好用的计算器:bc

1.简单好用的计算器&#xff1a;bc &#xff08;1&#xff09;参数&#xff1a; &#xff08;2&#xff09;实例&#xff1a; 执行浮点运算和一些高级函数 设定小数精度&#xff08;数值范围&#xff09; 进制转换 执行结果为&#xff1a;11000000&#xff0c;这是用bc将十进制…

block,inline,inline-block的区别

最近正在复习&#xff0c;紧张地准备几天后的笔试&#xff0c;然后刚好看到这个地方。 block&#xff1a;块级元素&#xff0c;会换行&#xff0c;如div,p,h1~h6,table这些&#xff0c;可以设置宽高&#xff1b; inline:行内元素&#xff0c;不换行&#xff0c;挤在一行显示&am…

anyproxy抓取移动http、https请求

windows下安装AnyProxy抓取移动App Http请求AnyProxy是阿里巴巴基于 Node.js 开发的一款开源代理服务器。做为中间代理服务器&#xff0c;它可以收集所有经过它的http请求流量&#xff08;包括https明文内容&#xff09;&#xff1b;它提供了友好的web界面&#xff0c;便于直观…

Windows 10 IoT Core 17101 for Insider 版本更新

除夕夜&#xff0c;微软发布了Windows 10 IoT Core 17101 for Insider 版本更新&#xff0c;本次更新只修正了一些Bug&#xff0c;没有发布新的特性。已知的问题: F5 driver deployment from Visual Studio does not work on IoT Core.F5 application deployment of headed f…