首页 > 代码库 > 你可能没听过的 Java 8 中的 10 个特性

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

Blog_treasure box__

你以前听到的谈论关于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。

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