Java8新特性

参考书籍——《Java8实战》

简单地说,Java8是自Java1.0发布18年以来,发生变化最大的一个版本。这个版本中Java并没有抛弃以前的任何东西,因此现有的代码都可以继续正常工作,Java8只是提供了一些新的强大功能,比如Lambda表达式、stream等,可以让你的代码看起来更简洁、更清楚,效率更高。Java8到底有哪些新特性,我总结了一下:

  • Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。

  • 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

  • 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。

  • 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。

  • Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。

  • Date Time API − 加强对日期与时间的处理。

  • Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。

  • Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

关于这些新特性,后面会一个个介绍。

可能你觉得用的Java7就不错,为什么要使用Java8?这让你很疑惑。首先,最新版的开发工具只支持Jdk8,并且在企业开发中,Java8的普及率已经很高,越来越多的企业被Java8的特性所吸引,已经开始使用Java8了,你不得不学习它。其次,Java8在Java7的基础上优化了,可以让你的代码效率更高,这在一个对于代码质量越来越看重的时代,你还有什么理由不学习Java8。

Java8的新特性的特点

 速度更快
 代码更少(增加了新的语法 Lambda 表达式)
 强大的 Stream API
 便于并行
 最大化减少空指针异常 Optional
其中,Lambda表达式和Stream是最为核心的,需要着重了解并熟练使用。

速度更快

最明显的例子就是HashMap的优化,HashMap的底层其实就是一个数组,默认长度是16,当把一个元素通过put方法添加到Map里时,会根据key的hashCode算法计算出它需要在数组存放的索引,如果索引位置没有元素就直接存进去,如果索引位置存在元素了,就需要equals方法来判定value值是否相等,如果相等直接覆盖,如果不相等则把新的元素也存进这个索引位置,和已经存在的元素形成一个链表。这就造成一个问题,如果当前索引的链表太大,你做put、delete操作效率大受影响,在Java8中这里做了优化,当满足以下两个条件时:Map的长度大于64并且链表的长度大于8,HashMap会自动把链表转成红黑树,这样效率就大大提高了。

Java8新特性

Java8新特性

另外,JVM内存模型也调整了,以前的方法区改为元空间,使用的是物理内存,降低了oom异常的概率。

代码更少

Lambda表达式允许将函数以参数的方式传递进方法中,相比于Java7你可以用更少的代码实现一个需求。

比如这里有个将集合排序的需求,Java7的写法是这样的:

public static void main(String[] args) {
	List<String> list = Arrays.asList("tom", "jack", "apache", "lucy");
	Collections.sort(list, new Comparator<String>() {
		@Override
		public int compare(String o1, String o2) {
			return o1.compareTo(o2);
		}
	});
	for (String str : list) {
		System.out.println(str);
	}
}

Java8的写法

public static void main(String[] args) {
	List<String> list = Arrays.asList("tom", "jack", "apache", "lucy");
	Collections.sort(list,(x,y) -> x.compareTo(y));
	for (String str : list) {
		System.out.println(str);
	}
}

其中排序的代码简洁到只有一行是不是很6?

Stream

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

便于并行

Java8对于并行的实现更加简单了。