虽然今年3月20日java12已正式发布,但是由于现实生产环境java8和java7应用的非常广泛,而java8又是最具革命性的版本,所以java8的十大特性还是非常有必要进行了解和学习的。java8在语言、编译器、类库、开发工具以及Java虚拟机等方面都有不少的特性。
一、增强接口的定义
在java8之前版本,接口的定义是不允许定义方法的。从java8开始,接口中可以定义默认方法和静态方法。默认方法的关键字是default,静态方法的关键字是static。
二、Lambda表达式
Lamda属于函数式编程的概念,Lambda允许把函数作为一个方法的参数,或者把代码看成数据。
一个Lambda表达式可以由用逗号分隔的参数列表、->符号与函数体三部分表示。
对于Lamda语法有三种形式:
1. (参数) -> 单行语句;
2. (参数) -> {多行语句} ;
3. (参数)->表达式。
一个简单例子:
Arrays.asList( "a", "b", "c","d").forEach( s -> System.out.println( s ) );
为了使现有函数更好的支持Lambda表达式,Java 8引入了函数式接口的概念。函数式接口就是只有一个方法的普通接口。为此,Java 8增加了一种特殊的注解@FunctionalInterface,作为函数式接口的象征。
函数式接口最典型的例子是java.lang.Runnable与java.util.concurrent.Callable。
三、方法引用
方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字。
方法引用在Java8之中一共定义了四种形式:
1 静态方法引用:类名称 :: static方法名称 ;
2 某个对象的方法引用: 实例化对象 :: 普通方法 ;
3 特定类型的方法引用: 特定类 :: 普通方法 ;
4 构造方法引用: 类名称 :: new ;引用的是无参数的构造器;
对于方法的引用,严格来讲都需要定义一个接口,在JDK1.8里面提供了一个包: java.util.function ,提供了可操作的方法。
四、Stream
Stream API是把真正的函数式编程风格引入到Java中。其实简单来说可以把Stream理解为MapReduce,它其实是一连串支持连续、并行聚集操作的元素。从语法上看,也很像linux的管道、或者链式编程,代码写起来简洁明了,非常酷帅!
五、Base64
在Java 8中,Base64编码成为了Java类库的标准。Base64类同时还提供了对URL、MIME友好的编码器与解码器。
六、Date/Time API
Java 8新的Date-Time API (JSR 310)受Joda-Time的影响,提供了新的java.time包,可以用来替代 java.util.Date和java.util.Calendar。
七、Optional
Java 8引入Optional类来防止空指针异常,Optional类最先是由Google的Guava项目引入的。Optional类实际上是个容器:它可以保存类型T的值,或者保存null。使用Optional类我们就不用显式进行空指针检查了。
八、重复注解
在Java 5中使用注解有一个限制,即相同的注解在同一位置只能声明一次。
Java 8引入重复注解,这样相同的注解在同一地方也可以声明多次。重复注解机制本身需要用@Repeatable注解。Java 8在编译器层做了优化,相同注解会以集合的方式保存,因此底层的原理并没有变化。
一般会用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration这些类。
九、扩展注解的支持
Java 8扩展了注解的上下文,几乎可以为任何东西添加注解,包括局部变量、泛型类、父类与接口的实现,连方法的异常也能添加注解。
十、JavaScript引擎Nashorn
Nashorn允许在JVM上开发运行JavaScript应用,允许Java与JavaScript相互调用。
其实除了这十大新特性之外,还有另外的一些新特性:
更好的类型推测机制:Java 8在类型推测方面有了很大的提高,这就使代码更整洁,不需要太多的强制类型转换了。
编译器优化:Java 8将方法的参数名加入了字节码中,这样在运行时通过反射就能获取到参数名,只需要在编译时使用-parameters参数。
并行(parallel)数组:支持对数组进行并行处理,主要是parallelSort()方法,它可以在多核机器上极大提高数组排序的速度。
并发(Concurrency):在新增Stream机制与Lambda的基础之上,加入了一些新方法来支持聚集操作。
Nashorn引擎jjs:基于Nashorn引擎的命令行工具。它接受一些JavaScript源代码为参数,并且执行这些源代码。
类依赖分析器jdeps:可以显示Java类的包级别或类级别的依赖。
JVM的PermGen空间(永久代空间)被移除:取代它的是Metaspace(元空间)。
喜欢的可以点关注。