你可能没听过的 Java 8 中的 10 个特性

你以前听到的谈论关于Java8的所有都是围绕lambda表达式. 但它仅仅是Java8的一部分. Java 8 有许多新特性---一些强大的新类和语法, 还有其他的从一开始就应该具有的东西.

我将要介绍我认为值得了解的10个精华特性. 它们中最少也会有一个或两个你想要试一试, 所以我们开始吧!

1. 默认方法

Java语言一个新添加的特性是你可以为接口(interface)的方法添加方法体(称为默认方法). 这些方法会被隐式地添加到实现这个接口的类中.

这能使你在不破坏代码的情况下为已存在的库添加新功能. 这很明显是个提升. 但另一方面这会混淆接口与类之间的界限, 因为接口用于定义契约, 而类用于定义具体实现. 从好的方面来说, 它会以一种优雅的方式使接口更智能, 并且避免了重复和扩展库. 但坏的方面, 我们稍后就会看到, 接口方法要查询this并将它转换成具体类. Shivers….

2. 进程终止

启动一个外部进程是你所做的事情中的一半-当这个进程崩溃, 挂起或消耗100% CPU时你要返回来对它进行调试. 现在Process类装备了两个新方法来帮助你控制不守规矩的进程.

第一个是 isAlive(), 它会让你不需要等待进程运行完毕就可以检查这个进程是否仍在运行. 第二个更强大的方法是destroyForcibly() , 它能让你强制杀死超时或不再需要的进程.

3. StampedLocks

这个特性着实让人兴奋了一把。没有人喜欢写同步机制的代码,当然同步机制也在一定程度上降低了你应用的吞吐量和性能,甚至可能会导致应用卡死。尽管如此,很多时候你别无选择。

在多线程情况下同时访问一个资源时,有很多同步的语法。最常用的是ReadWriteLock(读写锁)以及相关基于它的扩展实现。这个方法通过阻塞线程来减少多线程环境下资源的竞争。理论上听起来不错,但实际上锁是非常慢的,尤其是大量写操作的线程中。

Java 8 引入了一种全新的称为StampedLock的读写锁. 这个锁不仅速度更快, 它更为乐观锁提供了一组强大的API, 通过它你可以以最小的代价取得一个读者锁, 甚至在选择期间不希望发生写操作.  在选择结束后你可以通过查询这个锁来查看在选择期间是否有写操作, 在这种情况下你可以选择是否重试, 更新锁还是放弃.

这个锁是个很强大的工具, 它需要一篇专门的文章来描述. 我对这个新玩意儿兴奋得头都晕了--做得好!

更多详情请参阅这里

4. 并发计数器

这是让开发多线程应用的人另一个值得兴奋的G点。一个简洁有效的多线程读写计数器的new API ,在某些情况下,它甚至比原子(AtomicIntegers)更快些!

5. Optional Values

我去,空指针!多少java开发者的噩梦。起初,或者至少1965年这个异常已经成为最流行的异常了。

借鉴了scala和Haskell的特性,java 8增加了一个新的模板Optional 来代替方法返回null。这不意味着他就是终结null的银弹,但是对于API设计者来说它从代码级别(而不是文档)表明可能传递给方法一个null值,这样调用者应当提前准备好对null的处理。同样地,这只能应用于新的API,同时假设调用者引用的是Optional 处理后的null而不是直接引用未处理的null值 。(译注:说白了就是使用返回Optional 对象代替返回null)

坦白的讲这个特性让我很纠结。一方面,null包含很多问题,因此我很重视在这之前做处理;另一方面来说,我很怀疑这样处理能否成功。Optional需要全公司不断的努力,但它并没有直接的价值。除非雷厉风行,否则它很可能会被放弃。

扩展阅读 here.

6. 注解任何东西

另外一个Java语言小改进是 annotation 现在能够添加在你代码的几乎所有东西 上。以前, annotation 只能加在像类或者方法声明上。使用 Java 8 的 annotation 可以加在变量和参数声明中,不仅在传递一个值给指定类型时,甚至是分配空间给一个新的对象的时候。这是通过静态分析和向导工具 (比如 FindBugs) 让Java 语言更友好,集中精力 (沿着 Java 文档工具和 API 改进) 的一部分 。这是个很棒的特性,但是更多的是像Java 7 引入的 invokeDynamic ,其真正的价值决定在于 社区用它来做什么。

7. 溢出操作

现在这里有了一系列从一开始就应该包含在核心库中的方法. 我最喜欢的一个习惯是调试当int超过2^32时的溢出, 然后继续随机地创建这个臭名昭著的bug(例如 "我是怎么得到这个奇怪的值的?").

这次也没有银弹, 但却有一系列操作数字的函数, 这些函数当以一种比隐式引起溢出的标准的+/*操作符更不能容忍的方式发生溢出时就会抛出异常.. 如果是我的话,我会将它设为JVM的默认模式, 使用允许算数溢出的显式函数(而不是+ *运算符).

8. 文件夹遍历

迭代目录树的内容在google搜索上很早就出现了(在这种情况下你可能会使用Apache.FileUtils). Java 8 为Files添加了10个新方法. 我最喜欢的是walk() ,它创建了一个懒惰流(对于大型文件系统很重要)来迭代目录结构的内容.

9. 强随机数生成

现今已有不少关于密码和密钥的脆弱性的讨论. 程序安全是个棘手的问题而且很容易犯错误. 这也是我喜欢在JVM中能够自动挑选最强随机数生成器的新SecureRandom.getinstanceStrong()方法的原因. 它降低了取得生成器失败, 或默认取得一个弱生成器从而导致密钥或加密值容易被破解的机率.

10. Date.toInstant()

Java 8 引入一个全新的 date time API。 因为已有的api并不好,这是相当可以理解的。现在 Joda 已经专注和深入 Java 的 date time API 好多年。但是,就算用新的API仍有个大问题存在—— 有数以吨计的代码和库在使用旧的API。

我们都知道面临这个问题,那么要做些什么?

因为 Java 8 已经做得相当优雅,在Date类中添加了一个新的方法toInstant() , 用来将其转化成为新的API。就算使用旧的Date API (在可预见的未来也是一样) , 也能让你快速升级到新的API。

如果你觉得文章还有什么该有的特性没提到,抑或是不同意我们的分析?请评论给我们——这就是发文的目的 !

原文地址:http://www.takipiblog.com/2014/04/30/10-features-in-java-8-you-havent-heard-of/

你可能没听过的 Java 8 中的 10 个特性

时间: 2024-08-12 00:58:05

你可能没听过的 Java 8 中的 10 个特性的相关文章

Java 8中你可能没听过的10个新特性

lambda表达式,lambda表达式,还是lambda表达式.一提到Java 8就只能听到这个,但这不过是其中的一个新功能而已,Java 8还有许多新的特性——有一些功能强大的新类或者新的用法,还有一些功能则是早就应该加到Java里了. 这里我准备介绍它的10个我个人认为非常值得了解的新特性.总会有一款适合你的,开始来看下吧. default方法 这是Java语言的一个新特性,现在接口类里可以包含方法体(这就是default方法)了.这些方法会隐式的添加到实现这个接口的每个子类中. 这使得你可

AndroidEventBus实战没听过你就out了(转载)

AndroidEventBus实战没听过你就out了 转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/40794879,本文出自:[张鸿洋的博客] 1.概述 最近大家面试说经常被问到EventBus,github上果断down了一份,地址:https://github.com/greenrobot/EventBus,的确是个不错的框架,主要用于事件的发布和订阅. EventBus定义:是一个发布 / 订阅的事件总线. 这么说应该

最难就业年,我没觉得有压力-JAVA学院张会军

导语:张会军,大学还未毕业,就先立业,在大学里也一样庸庸碌碌:面对大四的就业,他也曾迷茫:在人生的关键时刻,他经历了怎样的历练?面对职场,又该怎样应对?对于应届毕业的他,在艰难就业形势下又如何游刃有余呢? 先机,挑战最难业季 又是一年毕业季,除了对相处四年的同窗依依不舍外,就业问题就像烫手的山芋盘桓在每一个90后的面前.2013年被戏称为"史上最难就业年",699万即将踏出学校大门的大学生和较往年缩水甚多的招聘岗位让就业形势格外严峻.面对巨大的就业压力,有的人选择转专业,有的人选择找关

中国最牛的7家人工智能企业,2个几乎没听过,1个由微软投资

注:本文非官方发布,部分数据不准确,仅供参考! 数月前,有关研究院推出AI First2017-2018中国人工智能先行企业榜在北京揭晓.其在智能交通.云计算.语音交互.人脸识别.智能医疗等多个领域,进行全面综合测评.最终得出中国目前最牛的7家人工智能企业,其中3家企业我们都耳熟能详.但有2家企业知名度较低,多数人没有听说过.除此,还有一家研究院,是由美国微软公司投资. 中国最牛的7家人工智能企业,2个几乎没听过,1个由微软投资1,百度,总得分94.73,位居中国第一.百度是全球最大的中文搜索引

java 1.7 1.8新特性

在JDK1.7的新特性方面主要有下面几方面的增强:1.jdk7语法上1.1二进制变量的表示,支持将整数类型用二进制来表示,用0b开头.1.2 Switch语句支持string类型1.3 Try-with-resource语句 注意:实现java.lang.AutoCloseable接口的资源都可以放到try中,跟final里面的关闭资源类似: 按照声明逆序关闭资源 ;Try块抛出的异常通过Throwable.getSuppressed获取1.4 Catch多个异常 说明:Catch异常类型为fi

关于java MulticastSocket中的joinGroup(SocketAddress mcastAddr,NetworkInterface netif)

今天复习了一下java网络编程这方面(其实是之前没有学好),之前在linux下用c来做过一些例子,不过不好久没有用也就忘得一干二净了.不知道c/c++的东西不太好记,还是当初没好好学. 关于组播这方面,其实别的问题没有,<JAVA网络编程>这本书说得很明白了,但遇到其中一个很令人费解的api,如下: java MulticastSocket中的joinGroup(SocketAddress mcastAddr,NetworkInterface netif) 第一个参数为什么是SocketAdd

Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));中的dout做为Socket输出流的代言.同样的,din是输入流的代言. 可以造成dout被关闭的操作有: 1.调用dout.close();或din.close();因为使用这种流关闭,会造成socket被关闭,所以输入输出

《java与设计模式》之装饰模式详解&amp;Java IO中的装饰器模式

1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况.有三个继承关系的类:Father.Son.GrandSon,我们要在Son类上增强一些功能怎么办?给Son类增加方法吗?那对GrandSon的影响呢?特别是对GrandSon有多个的情况,你会怎么办?认真看完本文,你会找到你的答案. JavaIO中,像下面的嵌套语句是不是很常见,为什么要怎样定义呢?理解装饰模式后,你会找到答案. DataInputStream in = new DataInp

Java 8 Lambda表达式10个示例【存】

PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码.而定义行为最重要的那行代码,却混在中间不够突出.Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码.这样有时可读性更好,表达更清晰.在Java生态系统中,函数式表达与对面向对象的全面支持是个激动人心的进步.将进一步促进并行第三方库的发展,充分利用多核CPU.尽