Java 8 中的 10 个特性总结及详解
作者:oschina 发布时间:2023-07-21 00:06:51
你以前听到的谈论关于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. Concurrent Adders
对从事多线程应用的人来说这是另一件小宝贝. 这是一个用于多线程计数器的简单高效的新API, 它比使用AtomicInteger更快. * 酷!
5. Optional Values
哦, 空指针, 所有Java开发者的噩梦. 从一开始(或最少在1965)它可能就是最流行的异常了.
借鉴自Scale和Hashell, Java 8 拥有一个新的称为Optional的模板, 用于封装可能为null的引用. 它绝不是终结null的银弹, 它更是一种方式-让API设计者从代码级别(而不是文档级别)表明一个null值可能会传入一个方法或从一个方法中返回, 以让调用者为null值做好准备. 因此, 这只能在新API下工作, 并且假设调用者不会让引用逃脱这个封装从而导致不安全的解引用.
我不得不说我对这个特性很矛盾. 一方面null有很大问题, 所以我倾向于在null发生前做好所有事. 但另一方面我很怀疑它能否成功.这是因为使用Optional需要全公司不断的努力,但它并没有直接的价值。除非雷厉风行,否则它很可能会被放弃.
6. 注解任何东西
另外一个Java语言小改进是 annotations 现在能够添加在你代码的 几乎所有东西 上。以前, annotations 只能加在像类或者方法声明上。使用 Java 8 的 annotations 可以加在变量和参数声明中,不仅在传递一个值给指定类型时,甚至是分配空间给一个新的对象的时候。这是通过静态分析和向导工具 (比如 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。
如果你觉得文章还有什么该有的特性没提到,抑或是不同意我们的分析?请评论给我们——这就是发文的目的 !


猜你喜欢
- java编程中字节流转换成字符流的实现方法import java.io.*;/*readLine方法是字符流BufferReader类中的方
- 因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同。经过我与几个同事的多
- DataTable可以通过RowStatus来判断状态是否发生了改变。但是有些时候我们希望在行状态即使为Modified的情况下也不要提示内
- 优秀的战士需要出色的剑才能战斗。同样,在现代IT中,每个编码人员都需要最好的Android开发人员工具来提高他们的技能和效率。在Androi
- 使用流读取、写入文件使用流把文件读取到字节数组://FileMode.Create, FileMode.Append //FileAcces
- 一个框架的使用,必然离不开其中的组件支持。我们在下载完mybatis框架后,因为大部分的内部结构还没有启动,就要手动的对其进行配置。在之前有
- 在开发过程中,碰到生成一个List对象,需要对其里面的每个对象都进行校验。但是,这个Lis
- 装饰器模式概述装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),属于结构型模式。它是指在不改
- import java.io.ByteArrayInputStream; import java.io.FileOutputSt
- 我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Java 提供DecimalFormat类,帮你用最快的速度将数字格式化为你需要的
- 专栏介绍本系列专栏会以虹猫蓝兔七侠传的故事为例来给大家详细分析所有模式,希望能给大家带来帮助!本期介绍模式: 简单工厂模式案例: 一个天外陨
- 本文实例讲述了Android获取SD卡及手机ROM容量的方法。分享给大家供大家参考,具体如下:这里通过一个简单的小例子,来获取SD卡的容量和
- 1.利用参数出现的顺序利用mapper.xml<select id="MutiParameter" resultT
- select 相当于 for 循环select id from IDArrayLinkedList a = new LinkedList()
- Java8Stream流操作List去重根据属性去重整体去重使用distinctArrayList<LabelInfoDTO>
- 文件写入为提供相对较高性能的文件读写操作,这里果断选择了 NIO 对文件的操作,因为业务背景需要数据的安全落盘。这里主要采用 ByteBuf
- 1. 问题描述springboot的面世,成为Java开发者的一大福音,大大提升了开发的效率,其实springboot只是在maven的基础
- 手把手教你用C#开发Android应用程序的方法和流程摘要:用C#能开发RFID-android吗?C#真的能开发android程序吗?C#
- using System;using System.Collections.Generic;using System.Data;using
- 百度百科说法:Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务