Lambdas表达式,lambdas表达式,依然是lambdas表达式,这也许是你听的最多的关于Java 8的讨论了吧。但是lambdas表达式仅仅是Java 8的一小部分,Java 8还有许多新的特性——新特性包含一些功能强大的类及其高级用法,另外一些则是早就应该在Java中的功能。
我整理了10大Java 8中我认为最值得学习的新特性,总有一样你会遇到并喜欢上它,一起来看看吧。
1、默认方法(default方法)
这是Java语言的一个新特性,我们可以在接口类中加入具体的方法体了(也叫做default方法),实现这些接口的子类会自动将default方法中的方法体添加进去。
这样我们就可以在不破坏原来代码的基础上扩展原有的类库,这听上去绝对很酷。但是从另外一个角度来看,这样做有点丧失接口的意义,使得接口定义和具体实现之间的界限模糊不清。可是好处也很明显,我们可以用一种很优雅的方式让接口变得更灵巧,也避免了代码冗余,同时还可以扩展原有类库。不好的地方就是,我估计很快就会看到有在接口方法里获取this引用然后强制转化成某个具体类型的写法了。
2、强制终止进程
当你用Java启动外部进程后,一旦这个进程崩溃,主程序就会陷入很麻烦的境地。现在,Java 8中的Process类提供了两个新方法,可以来帮你管制这些烦人的进程了。
第一个是isAlive()方法,我们可以利用这个方法来判断指定的外部进程是否还存活着。第二个方法更强大,它是destroyForcibly()方法,可以将崩溃或者不再需要的进程强制终止。
3、StampedLock
看到这个,忍不住有点激动人心。没有人喜欢在代码中使用同步,它会让你的程序效率更低,而且严重的还可能会引起程序崩溃。尽管如此,有时候我们还是不得不使用它。
当多个进程访问一个资源的时候,有多种方法可以进行同步。其中用得最多的一种是ReadWriteLock以及基于它的几种实现。它通过阻塞写线程的方式来允许多个线程并发的读,这样减少了线程之间的竞争。听起来还不错,但实际上这个锁实在是太慢了,尤其是当有许多写线程的时候。
值得高兴的是,现在Java 8中推出了一个新的读写锁,名字叫StampedLock。StampedLock不仅读写更快,而且还提供了很多强大的API来创建乐观锁。这样如果没有写操作在访问临界区域的话,你只需很低的开销就能获取到一个读锁。访问结束后你可以查询锁来判断这期间是否发生了写操作,如果有的话再选择进行重试,升级锁,或者放弃这个操作。
这的确是一个非常强大的工具,它本身就值得专门花一篇文章来介绍。这个新玩意儿让我感到非常激动和兴奋,它真的是太棒了。
4、并行计数器
这是又是一个多线程应用经常会用到的小工具,它提供了简单高效的新接口来实现多线程的并发读写计数器的功能,和AtomicInteger比起来,它要更快一些。相当赞的工具。
5、Optional
不好,空指针又来了,这是所有Java开发人员噩梦的开始。这估计是有史以来最常见的异常了,至少是1965年以来。
Java 8借鉴了Scala和Haskell,提供了一个新的Optional模板,可以用它来封装可能为空的引用。这绝不是终结空指针的绝对保障,更多只是使API的设计者可以在代码层面声明一个方法可能会返回空值,调用方应该注意这种情况。正因为这个,这只对新的API有效,前提是调用方不要让引用逃逸出封装类,否则的话引用可能会在外面被不安全的废弃掉。
我对这个新的特性真的是又爱又恨。一方面,空指针是一个大问题,只要能解决这个问题的东西我都欢迎。但另一方面,我对它是否能担此重任执怀疑的态度。这是由于使用它的话需要全公司的集体努力,短期内很难会有见效。除非大力地推广,否则很可能会功亏一篑。
6、一切都能注解
另外Java 8还有一个小的改进,Java注解可以支持任意类型了。早期版本的Java中,我们只能对类或者方法是用注解,但是Java 8中,我们可以在声明变量或者参数的时候使用注解。这是Java为了更好地支持静态分析及检测工具(比如FireBug)而做的工作中的一部分。这是个很不错的特性,但是和Java 7的invokeDynamic一样,它的真正价值取决于社区以后如何去使用它。
7、溢出
这些方法早就该出现在Java的核心类库里了。我很喜欢做一些类似2^32整型溢出时的情况,故意弄一些变态的bug(我是如何得到这么奇怪的值的?)。
同样的,这也不是什么绝对的保障,只不过是提供了一组函数,这样你在使用+/*操作符进行数值操作的时候,如果出现了溢出,会抛一个异常。如果我可以决定的话,我会把它作为JVM的默认模式,显式的标明函数会出现数值溢出。
8、目录遍历
遍历目录树这种事通常都得上Google搜下怎么实现(你很可能用的是Apache.FileUtils)。Java 8给Files类做了一次整容手术,增加了十个新的方法。我最喜欢的一个是walk()方法,它遍历目录后会创建出一个惰性的流(文件系统很大的情况下非常有用)。
9、增强的随机数生成
现在经常都在讨论密码或者密钥容易遭受攻击的事。程序的安全性是项很复杂的工程,并且很容易出错。这就是我为什么喜欢这个新的SecureRandom.getinstanceStrong()方法的原因,它能自动选择出当前JVM可用的最佳的随机数生成器。这样减少了获取失败的机率,同时也避免了默认的弱随机数生成器可能会导致密钥或者加密值容易被黑客攻破的问题。
10、Date.toInstant()
基于目前Java日期API太难用的原因,现在Java 8引入了新的日期API。近几年来Joda一直是Java日期API用的最多的。尽管Java 8推出新的日期API,但一个严重的问题需要我们解决——那些大量使用旧API的老代码该怎么办?
并且我们还知道这种现状仍将继续存在下去。到底该怎么做呢?
Java 8很优雅的解决了这个问题,它给Date类增加了一个新的方法toInstant(),它可以将Date转化成新的实现。这样你马上就可以切换到新的API,尽管现有的代码还在使用老的日期API(并且在可预见的未来仍将继续这样)。
你是否觉得我对Java 8的新特性还有遗漏,或者我有讲的不对的地方,还请大家指教。大家可以在下面的评论中进行讨论。
文章相关课程 BF-TECH-J2EE软件开发工程师就业班课程(风舞烟主讲)-10年IT从业经验结晶 Hadoop大数据零基础高端实战培训系列配文本挖掘项目(挑战年薪50万) 基于SSH2+LigerUI+JBPM5+Node.js技术实现大型J2EE金融行业财务预算系统 (第二季适合二年以下的开发者)