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

Blog_treasure box__

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

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

1. 默认方法api

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

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

2. 进程终止并发

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

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

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。

若是你以为文章还有什么该有的特性没提到,抑或是不一样意咱们的分析?请评论给咱们——这就是发文的目的 !

相关文章
相关标签/搜索