阅读更多

24顶
0踩

编程语言
Java 8或许是 迄今为止最令人期待的Java版本,最初定于今年的9月份发布,但由于一系列的安全漏洞问题,目前已推迟到明年的3月份。



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

Streams

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

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

顺序流:

List <Person> people = list.getStream.collect(Collectors.toList());


并行流:

List <Person> 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<Person> 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里实现事务和其它项目,我们一般会使用 JavaAssistcglib的扩展类来构建动态代理和字节码操作。而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里添加一个 java.time包来清理各种时间接口。它看起来很符合现在开发者的胃口,拥有各种各样的时间API。

Java API可以处理一些时空连续体方面的特性,比如距离、质量、重量等,这是值得称赞的,但我仍然认为 Currency会处理得更好。我认为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地址和基于名字的虚拟主机,比如我访问 podcasts.infoworld.com[/url][url=http://www.infoworld.com/]www.infoworld.com,最后的网址是一样的,但访问的主机名是不一样的,所以我有可能会访问到不同的Web页面。然而,因为SSL,我可能无法分享IP地址。由于HTTP主机头是建立在基于命名的虚拟主机上,并且主机也是依赖SSL来实现加密/解密的,所以,不得不为每个SSL证书申请不同的IP地址。

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

总结

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

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

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

英文来源: InfoWorld

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

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


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

再比如,我杜撰的段代码
List<Person> 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 楼 dsjt 2014-03-20 16:11
要不要简称为 J8呢?
27 楼 MrLee23 2014-03-20 14:58
lambda,无非就是用符号把以前的那些代码给封装了一下嘛。
类似javascrip与JQuery一样。本人瞎说,请勿喷。。。。
26 楼 priend 2013-10-11 15:32
bug很多,坐等java9
25 楼 docong 2013-10-09 13:30
“使用Lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多”
连主次关系都没高对。
24 楼 flashing 2013-09-15 22:15
iminto 写道
flashing 写道
icefishc 写道
SMCwwh 写道
clxy 写道
引用
...我认为Java API需要好好地修剪而不是添加更多的东西...

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

Stream比较酷,一个内置轻量Map/Reduce实现啊!

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

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

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

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


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

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

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

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

Stream比较酷,一个内置轻量Map/Reduce实现啊!

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

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

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

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


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

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

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


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

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

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

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

Stream比较酷,一个内置轻量Map/Reduce实现啊!

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

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

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

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


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

发表评论

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

相关推荐

  • JSP运行环境配置.docx

    JSP运行环境配置,包括jdk,tomcat下载,安装,环境配置,tomcat在eclipse,myeclipse中配置,mysql,sqlserver等数据库在eclipse,myeclipse中连接的代码。

  • java一定要配置环境变量吗_java环境变量配置不成功

    配置java环境变量是为了能在运行-cmd-中用java命令来编译和运行java代码.在我们的window系统中,安装的软件都有路径的.如果我们不配置环境变量的话,我们就只能在jdk的安装路径下才能运行.换到了其它的路径就不行了,系统就会提示找不到路径,为了能在任务路径下都可以运行jdk,我们就要配置环境变量.自己的一点意...

  • JSP 概述(四)

    Weblogic 是 BEA 公司的产品,它又分为 webLogic Server、WebLogic Enterprise 和 WebLogic Portal 系列,其中 WebLogic Server 的功能特别强大,它支持企业级的、多层次的和完全分布式的 Web 应用,且服务器的配置简单、界面友好,对于寻求能够提供 Java 平台所拥有得一切应用服务器的用户来说,WebLogic 是一个十分理想的选择对象;在项目开发过程中需要使用数据库,用来存储项目中需要的信息,根据项目的规模采用合适的数据库;

  • JSP运行环境搭建

    安装

  • 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程序设计之(1)Tomcat安装及环境变量配置

    JSP程序设计,Tomcat下载及安装,Java环境配置,JDK

  • 在windows中配置jsp环境(超详细)

    在windowsserver服务器中配置jsp的运行环境 首先,你要拥有一台windows server的服务器,这里推荐腾讯云,不仅仅有学生试用一个月,而且更加方便。腾讯云跳转:https://cloud.tencent.com/ 接着用腾讯云给出的rdp连接上服务器 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-buE3T1TO-1611137548927)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-imag

  • JSP运行环境搭建.ppt

    JSP运行环境搭建.ppt,需要的可以下载

  • JSP的配置教程

    1.Tomcat的安装 首先进入Apache官网下载Tomcat8.0,可以打开如下链接,也可以百度直接搜索Tomcat8.0,进入下载页面:http://tomcat.apache.org/download-80.cgi。将页面下拉到如下图红色箭头所示位置: 此处我们以windows64位版本为例,点击上图中所示的链接,即可开始下载。可以看到,此软件比较小,只有9M多。下载好之后点击n...

  • jsp配置

    本人也是刚刚才开始学jsp,想把配置tomcat的一些经验来说一下。一. 环境变量配置首先安装jdk和tomcat,然后配置环境变量。环境变量在我的电脑右键->属性->高级->环境变量,set是我按照dos的批处理命令写的,暂时可以不用管,只要知道set后面的意思就可以了,之后会给懒人一种办法。/*set JAVA_HOME=E:/Tools/Environment/Java/j2sdk1.4

  • JSP环境的配置过程!(JDK+TOMCAT+MYSQL)

    JSP实验环境的配置1、准备工具JDK      版本1.5   下载地址:http://java.sun.com/j2se/1.5.0/download.jspTOMCAT   版本5.5   下载地址:http://tomcat.apache.org/download-55.cgiMYSQL    版本5.0   下载地址:http://dev.mysql.com/downloads/mysql/5.0.htmlJDBC驱动 版本3.1   下载地址:http://dev.mysql.com/downl

  • JAVA 环境变量配置

    JAVA环境变量配置: 1、新建系统变量JAVA_HOME为jdk的安装目录:如C:\ProgramFiles(x86)\Java\jdk1.7.0_13 2、path编辑输入%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 3、新建CLASSPATH变量变量值填写.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar 命令...

  • Servlet/JSP的配置使用,原来这么简单!

    一、相关软件介绍   1、 JDK:Java2的软件开发工具,是Java应用程序的基础。JSP是基于Java技术的,所以配置JSP环境之前必须要安装JDK。 2、 UFO:最新发布的支持jsp的服务器软件,作为独立的Web服务器来使用。即支持静态页面、同时也支持动态页面,处理这两种页面都很迅速;而软件自身很健壮,不会出现内存泄漏和服务器自己宕掉的现象。对于初学者来说不用做任何部署配置环...

  • 有关idea 的jsp配置小教程(2019版)

    有关idea 的jsp配置小教程(2019版) tomcat的安装 付链接: jdk的配置 付链接: idea的配置 1. 配置tomcat 如图,点击设置 点击+号,添加tomcat的服务 在文件夹浏览tomcat的解压的位置,进行选中 如此服务算是添加好了 接下来进入重点: 2. 创建项目设置tomcat 如图项目创建一定要选中web Application 创建好了项目之后,如图下点击倒三角进行配置 如图下,想要配置ch3项目的tomcat,那么点击+号进行添加tomcat服务 如下图点

  • JSP的环境配置(超详细版)

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

  • 2020-28-31小测

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

  • 搭建Web环境、初识JSP

    ​c/s架构:是客户端与服务器架构,常用于大型游戏,APP等特点: 安装或者更新都需要下载安装包,内容管理方便,可分模块安装下载。B/S架构:是浏览器与服务器架构特点:更新只需更改代码重启服务器,移植性强,只要有浏览器即可。不同点:硬件环境: C/S通常是建立在专用的网络上,小范围的网络环境。而B/S是建立在广域网上的,适应范围强,通常有操作系统和浏览器就行;软件安装和升级维护:c/s架构需要下载安装包更新安装升级,b/s架构重新发布就升级完成。

  • JSP环境简单配置

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

Global site tag (gtag.js) - Google Analytics