你可能没听过的 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. Concurrent Adders
对从事多线程应用的人来说这是另一件小宝贝. 这是一个用于多线程计数器的简单高效的新API, 它比使用AtomicInteger更快. 真他妈酷!
5. Optional Values
哦, 空指针, 所有Java开发者的噩梦. 从一开始(或最少在1965)它可能就是最流行的异常了.
借鉴自Scale和Hashell, Java 8 拥有一个新的称为Optional的模板, 用于封装可能为null的引用. 它绝不是终结null的银弹, 它更是一种方式-让API设计者从代码级别(而不是文档级别)表明一个null值可能会传入一个方法或从一个方法中返回, 以让调用者为null值做好准备. 因此, 这只能在新API下工作, 并且假设调用者不会让引用逃脱这个封装从而导致不安全的解引用.
我不得不说我对这个特性很矛盾. 一方面null有很大问题, 所以我倾向于在null发生前做好所有事. 但另一方面我很怀疑它能否成功.这是因为使用Optional需要全公司不断的努力,但它并没有直接的价值。除非雷厉风行,否则它很可能会被放弃.
更多关于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 8 中的 10 个特性的更多相关文章
- java多线程中的三种特性
java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...
- Java 8中你可能没听过的10个新特性
lambda表达式,lambda表达式,还是lambda表达式.一提到Java 8就只能听到这个,但这不过是其中的一个新功能而已,Java 8还有许多新的特性——有一些功能强大的新类或者新的用法,还有 ...
- Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...
- 关于java MulticastSocket中的joinGroup(SocketAddress mcastAddr,NetworkInterface netif)
今天复习了一下java网络编程这方面(其实是之前没有学好),之前在linux下用c来做过一些例子,不过不好久没有用也就忘得一干二净了.不知道c/c++的东西不太好记,还是当初没好好学. 关于组播这方面 ...
- Java 8 Lambda表达式10个示例【存】
PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- java 1.7 1.8新特性
在JDK1.7的新特性方面主要有下面几方面的增强:1.jdk7语法上1.1二进制变量的表示,支持将整数类型用二进制来表示,用0b开头.1.2 Switch语句支持string类型1.3 Try-wit ...
- 20155223 2016-2017-2 《Java程序设计》第10周学习总结
20155223 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 Java Socket编程 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向 ...
- 20145202马超 2016-2017-2 《Java程序设计》第10周学习总结
学号 2016-2017-2 <Java程序设计>第X周学习总结 教材学习内容总结 一.网络编程 1.网络概述 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事 ...
随机推荐
- codeforces #313 div1 A
捕获一只野生大水题! 首先我们知道边长为L的正三角形含有边长为1的小正三角形为L^2个 那么我们可以通过在六边形的正上,左下,右下补充正三角形使得原图形变成正三角形 然后再将补充的减去即可 #incl ...
- UIViewController中各方法调用顺序及功能详解
UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...
- IOS - IOS之同步请求、异步请求、GET请求、POST请求
1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然 ...
- Java IO2:字节流
输入输出流: • 输入/输出时, 数据在通信通道中流动. 所谓“数据流(stream)”指的是所有数据通信通道之中,数据的起点和终点. 信息的通道就是一个数据流.只要是数据从一个地方“流” 到另外一个 ...
- SRM 587 DIV1
要掉到DVI2了..好不容这次的250那么简单,500的题知道怎么做,可惜没调出来500. 250的题很简单,从第1步到第N步,每次要么不做,要么走i步,且X不能走,问说最远走多远. #include ...
- 利用循环removeChild删除节点只删除一半问题
<!DOCTYPE html> <html> <head> <title>adduser.html</title> ...
- mysql concat和group_concat
mysql concat(str1,str2...)连接两个字符串,(数字也是可以的,会转成字符串) MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL mys ...
- 捉虫记2:windows程序句柄泄露的上下文环境
作为程序员,开发程序是基本功,而调试程序也是必不可少的技能之一.软件在主体功能开发完成后会经历各个阶段的测试,才会被发布.在测试过程中,出现较多的可能就是内存泄漏,句柄泄漏,异常崩溃等属于非功能型的软 ...
- 摄像头(2)调用系统拍照activity来录像
import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager ...
- poj 1753 Flip Game 枚举(bfs+状态压缩)
题目:http://poj.org/problem?id=1753 因为粗心错了好多次……,尤其是把1<<15当成了65535: 参考博客:http://www.cnblogs.com/k ...