编程没有银弹:探讨 java 8 新增特性的优缺点 -买球官网平台

24顶
0踩

java 8或许是 ,最初定于今年的9月份发布,但由于一系列的安全漏洞问题,目前已推迟到明年的3月份。



java 8试图“创新”,根据 ,就是把其他框架或语言里成熟的特性“偷”进来。在新版本发布之前,java社区就已经开始讨论lambda项目、streams、函数式接口等其他好东西。下面就让我们一起来看下这些伟大的功能,看看它们各自的优缺点,好让你更好地应用在项目中。

streams

集合(collections)的改进也是java 8的一大亮点,而让集合越来越好的核心组件则是“stream”。它与java.io包里的inputstream和outputstream是完全不同的概念,它是一个全新的概念,大家不要混淆。

此外,stream的出现也并不是要取代arraylists或其他集合,它提供了一种操作大数据接口,让数据操作更容易和更快。stream是一次性使用对象,一旦被遍历,就无法再次遍历。在遍历时,它具有过滤、映射以及减少遍历数等功能。每个stream都有两种模式:顺序执行和并行执行,其能够利用多核处理器的优势,并可以使用 并行方式来拆分任务和加速处理过程。

顺序流:

list  people = list.getstream.collect(collectors.tolist());


并行流:

list  people = list.getstream.parallel().collect(collectors.tolist());


顾名思义,当使用顺序方式去遍历时,每个item读完后再读下一个item。而使用并行去遍历时,数组会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。

并行流实例:

list originallist = somedata;
split1 = originallist(0, mid);
split2 = originallist(mid,end);
new runnable(split1.process());
new runnable(split2.process());
list revisedlist = split1   split2;


由于一个stream只能被遍历一次,通常会返回另外一个stream,可以使用终端方法(terminal method)来获取有用的结果,终端方法可以是sum()、collect()或toarray()等。在stream被终止之前,操作的结果不会被实现。

double result = list.getstream().maptodouble(f -> f.getamount()).sum();
list people = list.getstream().filter(f -> f.getage() > 21).collect(collectors.tolist());


该功能最大的好处是允许使用多核处理器来处理集合,这样处理速度会更加快速。而最主要的问题则是可读性。随着流链的加长,很有可能影响可读性。其它问题则来源于内置的新东西来支持这个新路径,这些是功能接口和lambda。

函数式接口

在java 8里将会有一个全新的功能——函数式接口(functional interfaces),就是可以在接口里面添加默认方法,并且这些方法可以直接从接口中运行。

这样就可以在接口中实现集合的向后兼容,并且无需改变实现这个方法的类,就可以让stream放置到接口中。一般而言,在接口中创建一个默认方法,然后实现该接口的所有类都可以使用stream(无论是默认方法还是非默认方法)。

基本上就是一种多继承形式,这样就变成了实现者之间的问题,作为实现人员,必须重写这些方法,他们可以选择使用超方法(supermethod),这也就意味着,许多实现接口的类需要改写。

这有可能是java 8里最让人关心的细节,也许java 8里的函数式接口对于熟悉scala的开发者来说不算新功能,但是他们可能会拿函数式接口与scala的特征进行比较。然而,两者之间不同的是:java 8里的函数式接口不能将一个引用指向实现类,而scala允许通过self关键字来实现该操作。会有一些语言狂热者说,java 8里的函数式接口只允许多继承行为,而不是状态。而scala里的多继承特征既可以是行为也可以是状态。

在java里实现事务和其它项目,我们一般会使用 或 的扩展类来构建动态代理和字节码操作。而scala的特行可以让我们更直接地实现。

一方面,函数式接口可能会被以继承方式滥用,另一方面,它们尽量不与scala特征重复。

lambda

java 8的另一大亮点是引入lambda表达式,使用它设计的代码会更加简洁。当开发者在编写lambda表达式时,也会随之被编译成一个函数式接口。下面这个例子就是使用lambda语法来代替匿名的内部类,代码不仅简洁,而且还可读。

没有使用lambda的老方法:

button.addactionlistener(new actionlistener() {
public void actionperformed(actionevent ae) {
system.out.println(“action detected”);
}
}
);


使用lambda:

button.addactionlistener(e -> {
system.out.println(“action detected”);
}
);


让我们来看一个更明显的例子。

不采用lambda的老方法:

runnable runnable1 = new runnable() {
@override
public void run() {
system.out.println("running without lambda");
}
};


使用lambda:

runnable runnable2 = () -> { system.out.println("running from lambda"); };


正如你所看到的,使用lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多。然而,在某种程度上,这些功能在scala等这些jvm语言里已经被广泛使用。

并不奇怪,sclala社区是难以置信的,因为许多java 8里的内容看起来就像是从scala里搬过来的。在某种程度上,java 8的语法要比scala的更详细但不是很清晰,但这并不能说明什么,如果可以,它可能会像scala那样构建lambda表达式。

一方面,如果java继续围绕lambda来发展和实现scala都已经实现的功能,那么可能就不需要scala了。另一方面,如果它只提供一些核心的功能,例如帮助匿名内部类,那么scala和其他语言将会继续茁壮成长,并且有可能会凌驾于java之上。其实这才是最好的结果,有竞争才有进步,其它语言继续发展和成长,并且无需担心是否会过时。

java time

time在java里已有很长一段时间,首先出现的java.util.date这个包,其次还有java.sql.date、calendar。但处理时间和日期需要大量的monkey代码,因此,像joda time等第三方库因此诞生。姗姗来迟,oracle终于决定在java里添加一个 包来清理各种时间接口。它看起来很符合现在开发者的胃口,拥有各种各样的时间api。

java api可以处理一些时空连续体方面的特性,比如距离、质量、重量等,这是值得称赞的,但我仍然认为 会处理得更好。我认为java api需要好好地修剪而不是添加更多的东西,并且首先java api应该对这些基本元素提供标准的兼容。

nashorn

nashorn是rhino的接替者,该项目的目的是基于java实现一个轻量级高性能的javascript运行环境。

jdk 7中添加了invokedynamic,其主要是用来支持非java语言,尤其是动态语言。而jdk 8中的nashorn将会给开发者提供一个更加实用的javascript实现。事实上,oracle已经有了他自己的node.js实现,叫做node.jar。这似乎比在java里运行javascript更加吸引人。

accumulators

自从jdk中集成了 java.util.concurrent以来,该特性并没有停止发展。相反,jdk 8将构建于jdk 7和fork/join框架之上,并通过加法器(adders)和累加器(accumulators)得到了进一步的发展。

首先是同步。但是,如果你使用同步在多线程之间进行增量计数,那么同步有可能难以负担。在java 6中通过让非竞争锁更廉价(cheap)来使同步不那么难以负担。其中大多数会使用vector来提升老应用程序性能,几乎每一个单线程都受到了java activation framework的影响。

java.util.concurrent包使得线程池和其他相对复杂的多线程结构变得更好,但是,倘若你想要通过跨线程来增加一个变量,那么就有点大材小用了。对此,我们采用一种比真正的锁更轻更快的原子。在jdk 8中,我们采用accumulators和adders,这些要比原子轻量多了,对于大多数异构代码来说,这些足以满足它们的需求,如果线程太多,那么可以增加一个计数器。但想要看到类似map/reduce实现或统计跨线程之间的总和,你仍然需要使用原子,因为如果要读取这些跨线程的值,累积的顺序是无法得以保证的。

hashmap修复

在java中使用string.hashcode()实现已是大家熟知的bug。如果在特定的代码中引入hashmap,可能会导致拒绝服务攻击。基本上,如果有足够多的参数hash到相同值,那么可能会消耗过多的cpu时间。

通常,hashmap bucket采用链表的方式来存储map条目。使用此算法存在大量的冲突,并且增加了o(1)到o(n)这种哈希变化的复杂性,为了解决这一问题,通过采用平衡tree算法来降低复杂度。

tls sni

sni是 (server name identification)的缩写,由于大多数公共网站的访客数量不是太多,几乎很少能达到数百万用户。很多网站都使用相同的ip地址和基于名字的虚拟主机,比如我访问 和 ,最后的网址是一样的,但访问的主机名是不一样的,所以我有可能会访问到不同的web页面。然而,因为ssl,我可能无法分享ip地址。由于http主机头是建立在基于命名的虚拟主机上,并且主机也是依赖ssl来实现加密/解密的,所以,不得不为每个ssl证书申请不同的ip地址。

在最近几年都是采用sni来解决这一问题的,java也不例外。这种方式得到了大多数浏览器的支持,现在apache和java也支持它。这意味着过不了多久,我们就可以看到apache和基于java的服务器使用oracle的ssl实现来支持sni,称作 。

总结

总之,java 8包含了一大堆非常实用的特性,这也是许多开发者想使用最新版本的原因之一。在我看来,stream是最好的一个特性。但愿并行集合也能够为其进程性能带来一些提升。而函数式接口可能并不会像预期中的那样好用,万一使用不当,可能会给开发者带来很多麻烦。

本文只是总结了部分java 8新特性,我们相信,在发布的时候将会有更多新特性与大家见面。你可以通过simon ritter在大会上的演讲ppt来了解目前已经添加到java 8中的55个新特性。

至于该如何取舍,各位开发者应该根据自己的实际需求去研究和使用,并不是所有的新特性就是好的,它们也存在优缺点。(编译:张红月/责编:王果)

英文来源:

  • 大小: 75.6 kb
来自:
24
0
评论 共 32 条 请登录后发表评论
32 楼 2014-11-12 14:01
lambda语法,函数式接口。。。我更情愿用内部类,多那几行影响不大,搞成这样java倒是越来越像个脚本语言了。。。。杯具~
31 楼 2014-04-30 19:13
clxy 写道
icefishc 写道

几乎所有主流现代语言都支持的东西, 在java圈子里还经常能看到有人反对。 


误会了,我不是反对。只是觉得难看。还是有那么点区别的哈。
比如泛型的<>,我还是觉得难看,虽然其实觉得很好用。

再比如,我杜撰的段代码
list people = arrays.aslist(new person[]{
		person1, person2, new person(i  )
}).getstream().filter(f -> f.getage() > 21).collect(collectors.tolist()); 

您说,这tyyd是标点符号们在玩过家家吗?!

好比一个原本话说得很清晰的孩子,看到“所有主流现代”都在玩手势,于是也开始跟着比划起来了,还越来越起劲...

30 楼 hantsy 2014-03-20 22:41
引用
使用lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多。


lambda, scala 语法简洁了,,,,但可读性我感觉是越来越差,,,特别是 scala 语法看得一头雾水。
29 楼 hantsy 2014-03-20 22:40
引用
使用lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多。


lambda, scala 语法简洁了,,,,但可读性我感觉是越来越差,,,特别是 scala 语法看得一头雾水。
28 楼 2014-03-20 16:11
要不要简称为 j8呢?
27 楼 2014-03-20 14:58
lambda,无非就是用符号把以前的那些代码给封装了一下嘛。
类似javascrip与jquery一样。本人瞎说,请勿喷。。。。
26 楼 2013-10-11 15:32
bug很多,坐等java9
25 楼 2013-10-09 13:30
“使用lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多”
连主次关系都没高对。
24 楼 2013-09-15 22:15
iminto 写道
flashing 写道
icefishc 写道
smcwwh 写道
clxy 写道
引用
...我认为java api需要好好地修剪而不是添加更多的东西...

这才是最最重要的部分啊...

stream比较酷,一个内置轻量map/reduce实现啊!

函数式接口,这个整个就是自打脸...

lambda...好看?!老了...好看?!个毛!

我现在看lambda也很别扭,估计后面用习惯了就不会了把,毕竟确实使代码更简洁了。

几乎所有主流现代语言都支持的东西, 在java圈子里还经常能看到有人反对。 


反对不至于吧,应该是觉得做的太难看了。groovy的闭包就好得多。

说实话,其他语言里,闭包什么的也不受欢迎,使用率也很低的

这个,太武断了啊,闭包简直无处不在啊。
23 楼 2013-09-15 18:43
flashing 写道
icefishc 写道
smcwwh 写道
clxy 写道
引用
...我认为java api需要好好地修剪而不是添加更多的东西...

这才是最最重要的部分啊...

stream比较酷,一个内置轻量map/reduce实现啊!

函数式接口,这个整个就是自打脸...

lambda...好看?!老了...好看?!个毛!

我现在看lambda也很别扭,估计后面用习惯了就不会了把,毕竟确实使代码更简洁了。

几乎所有主流现代语言都支持的东西, 在java圈子里还经常能看到有人反对。 


反对不至于吧,应该是觉得做的太难看了。groovy的闭包就好得多。

说实话,其他语言里,闭包什么的也不受欢迎,使用率也很低的
22 楼 2013-09-09 16:32
哈,你说的30行太极端了,30行和3000行的取舍比较简单,肯定不会选择3000行。

但是310行和360行代码的区别就没有那么大,与其追求把330行代码简化成310行,不如想办法在这310行代码中,让思路变得清晰,甚至如果为了让代码更清晰,变成了360,我觉得都能接受。


我的意思很简单,为了让思路清晰,逻辑清晰,可以去想办法让代码行数少一些,但是如果思路还是那样,逻辑还是那样,只是减少代码行数,甚至逻辑混乱,理解困难,那么不减少也罢。
21 楼 2013-09-09 13:58
windshome 写道
现代语言演变的趋势真不好。非要追求什么代码清晰,其实是否清晰,不在于需要些的代码行数多,还是行数少。关键是思路清晰,易于理解,过于追求行数是个很不好的事情。

代码的清晰,最终呈现出来的就是方法有多少行?类有多少行?
30行的代码远比3000行的代码要适合阅读

方法过大或类过大,绝对需要考虑解构了
20 楼 2013-09-09 13:21
现代语言演变的趋势真不好。非要追求什么代码清晰,其实是否清晰,不在于需要些的代码行数多,还是行数少。关键是思路清晰,易于理解,过于追求行数是个很不好的事情。
19 楼 2013-09-09 11:31
string的hashcode方法的bug能否讲清楚点?
18 楼 2013-08-10 21:47
icefishc 写道
smcwwh 写道
clxy 写道
引用
...我认为java api需要好好地修剪而不是添加更多的东西...

这才是最最重要的部分啊...

stream比较酷,一个内置轻量map/reduce实现啊!

函数式接口,这个整个就是自打脸...

lambda...好看?!老了...好看?!个毛!

我现在看lambda也很别扭,估计后面用习惯了就不会了把,毕竟确实使代码更简洁了。

几乎所有主流现代语言都支持的东西, 在java圈子里还经常能看到有人反对。 


反对不至于吧,应该是觉得做的太难看了。groovy的闭包就好得多。
17 楼 2013-08-09 15:31
更新的好快啊,java7都没怎么用,8就出来了
16 楼 2013-08-08 12:17
说的不错~
15 楼 2013-08-08 09:10
感觉不错,支持^_^
14 楼 2013-08-08 08:25
哥其实是来看语言之间互喷的。
13 楼 2013-08-08 07:22
stream?? c# 的东西又再次出现了.... 这哪是java,明明是java#嘛,

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 想要配置jsp运行环境的不妨看一下,介绍的通俗易懂,

  • jsp的环境配置 jdk的设置 jsp的环境配置其实和java的环境配置差不多,首先都是要先将jdk下载好,附上下载链接 https://www.oracle.com/java/technologies/javase-downloads.htmldownloads.html,打开系统环境变量设置 hhhh觉得贴图更加清楚吧 点击环境变量后,点击新建,输入 选择文件目录为下载jdk所在的路径,还有path,双击即可设置,也是新建,然后输入%java_home%\bin,bin是jdk的二进制文件,也就是告

  • 一、什么是jsp 1、jsp简介 jsp全名为java server pages,中文名叫java服务器页面,其根本是一个简化的servlet设计,它是由sun microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。 jsp技术有点类似asp技术,它是在传统的网页html(标准通用标记语言的子集)文件(*.htm,*.html)中插入java程序段(scriptlet)和j...

  • 目录1.jsp简介1.2.jsp技术的特点1.3运行原理2.如何下载tomcat 1.jsp简介 - jsp全称是java server pages,用于开发动态web资源的技术 - sun公司于1998年发布jsp第一版,目前最新版本是随java ee 7一起发布的jsp 2.3版 1.2.jsp技术的特点 1. jsp是一种服务器端脚本语言,其出现降低了servlet编写页面的难度 2. jsp本质上就是servlet,实际上jsp是首先被翻译成servlet后才编译运行的, 因此jsp能够实现serv

  • 目录一、jsp介绍二、静态网页&动态网页三、软件开发模式,b/s和c/s四、url介绍五、配置tomcat六、编码设置 一、jsp介绍 jsp涵盖了前面所学习的高级api oracle javascript jquery,是一门综合性比较强的学科,相当于s1阶段学习的swing; 何为jsp:全拼“java server pager”中文“java 服务器”,页面是由sun micrdsystems 公司主导创建的一种动态网页开发技术标准 二、静态网页&动态网页 动态网页:动态网页就是以数据

  • jsp程序设计

  • 1)熟悉 jsp 开发环境; 2)掌握 tomcat 安装及配置; 3)掌握 eclipse中配置jre、tomcat的方法; 4)熟练使用eclipse新建web工程、部署、运行; 5)熟悉web工程配置。1)安装与搭建jsp开发环境. 2)请编写一个简单的jsp页面,显示英文字母表(包括大小写)。 3)编写三个jsp页面,通过传递圆的半径、梯形的上底、下底和高,实现求圆面的面积、梯形的面积。1)能够在自己的计算机上安装搭建jsp开发环境。 2)能使用eclipse新建web工程、编写一个简单的jsp页面

  • jsp的开发和运行环境主要用到三个工具 1.jdk(java的开发工具包) 2.tomcat服务器 3.eclipse可视化编程工具 一、jdk的安装与环境变量的配置 1、进入买球官网平台官网https://www.oracle.com/technetwork/java/javase/downloads/index.html下载对应系统版本的jdk,一般为windows x641、进入买球官网平台官网 2.将jdk安装好之后需要配置系统环境变量,下面是步骤 右击我的电脑→属性→高级系统设置→高级→环境变量;系统变量里面 点击(新建

  • 一、jsp技术特性 二、jsp执行流程 三、jsp开发及运行环境 1、配置jdk路径 2、web服务器–tomcat tomcat—主要目录 修改端口号 配置虚拟目录 配置买球买球官网平台官网平台首页 四、编写第一个jsp文件 五、dreamweaver中测试服务器的设置 1、建立站点 2、设置测试服务器 ...

  • 这里写自定义目录标题欢迎使用markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右smartypants创建一个自定义列表如何创建一个注脚注释也是必不可少的katex数学公式新的甘特图功能,丰富你的文章uml 图表flowchart流程图导出与导入导出导入 一、简答题: 1、按从低到高的顺序写出osi七层模型 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 2、什么是

  • 1、jdk的安装和配置 1)下载jdk,我下载的是1-jdk-6u26-windows-i586.exe,放在d:\studysystem\javaweb\jdk目录下。 2)安装jdk,直接你下载的.exe文件就可以安装了,注意的是,安装目录要自己修改一下,默认的是c盘,最好不要放在c盘,我的jdk安装目录是d:\java\jdk1.6.0_26。 3)配置环境 右击“计算机”,选择“属...

  • jsp运行环境包括两部分,分别是jdk开发工具和tomcat服务器。jdk开发工具负责编译和执行java文件,而jsp服务器负责将jsp文件转化为java文件,提供帮助。 一.jsp服务类型有很多:tomcat,resin,jboss,weblogic等。 第一部分 jdk安装 根据电脑系统类型,在网址里选择要下载的jdk(这里就不介绍了) 第二部分 安装tomcat服务器 下载to

  • 要学习jsp开发,必须先搭建一个符合jsp规范的开发环境。本文以实用为原则,介绍了以tomcat服务器为核心的3种配置jsp环境的方法。   关键字 jsp引擎,web服务器,配置  sun推出的jsp(java server pages)是一种执行于服务器端的动态网页开发技术,它基于java技术。执行jsp时需要在web服务器上架设一 个编译jsp网页的引擎。配置 j...

  • 首先是下载工具:建议初学者用editplus+jdk,我觉得如果用例如jb,eclipse,jcreator,虽然刚开始的时候比较方便,但是确使初学者门不知道怎样配置环境变量,从而难以达到知其然,知其所以然的地步可以通过如下地址下载:editplus(最新版本是v2.11):http://count.skycn.com/softdown.php?id=3641&url=http://sc-http

  • 文章目录前言一、下载tomcat二、配置tomcat环境变量三、如何启动tomcat?总结 前言 jsp开发环境的配置需要配置jdk和tomcat。本文在jdk已经配好的情况下配置tomcat。 一、下载tomcat 下载网址:http://tomcat.apache.org/. 网页左侧download一栏选择下载tomcat7。 为什么选tomcat7? 因为一般开发一般选第一个通用版本即可,迁移方便。 正式环境部署时建议下载对应操作系统的tomcat,充分发挥服务器性能。 点击tomcat7

  • jsp运行环境安装、配置和测试一、  安装配置jdk1、进入jdk买球官网平台官网http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html2、选择java se development kit 8u172,根据自己的电脑选择32位或者64位进行下载。3、下载完成后安装jdk,双击jdk-8u161-w...

  • 由于jsp使用java作为脚本语言,因此需要建立java的运行环境。另外,jsp是基于web的应用程序,需要特定的web服务器程序支持 第一步:配置java开发工具包jdk(java develop kit) 1.jdk安装 在下载页面中选择接受许可,并根据自己的系统选择对应的版本,本文以 window 64位系统为例: ① 双击下载的jdk安装包可执行文件开始安装,第一次为jdk的安...

  • eclipse下配置jsp环境方法说明 声明:本说明仅为经验性说明,而非原理分析性说明。即按照此说明操作可以正常进行为win10系统下jsp项目的编写及运行,而其中原理本人并不十分清楚。想要深入研究的同学,请自行查阅其它资料。 一、jdk的安装 jdk:jdk包括运行java程序所必须的jre环境及开发过程中常用的库文件。jdk包含jre(java运行环境),而jre包含jvm(java虚拟...

  • 一、需要的安装软件:       1、   sql server 2000  2、   sql server 2000 sp4补丁 3、   sql server 驱动程序   压缩文件:sql server 2000 drivers for jdbc          安装的时候选择 internet 浏览器 4、    安装jdk ,压缩文件   j2sdk-1_4_0-w

  • sun推出的jsp(java server pages)是一种执行于服务器端的动态网页开发技术,它基于java技术。执行jsp时需要在web服务器上架设一个编译jsp网页的引擎。配置 jsp 环境可以有多种途径,但主要工作就是安装和配置web服务器和jsp引擎。  下面就以tomcat作为jsp引擎,配合tomcat、apache、iis这三种web服务器来讲述3种搭建jsp运行环境的方案。  一

global site tag (gtag.js) - google analytics