JDK1.8有哪些新特性?JDK1.8详细介绍—叩丁狼
JDK1.8有哪些新特性?JDK1.8详细介绍
JDK1.8目前在企业中已经广泛被应用,今天我们将学习以下方面的新特性:
Lambda表达式
函数式接口
方法引用
接口的默认方法和静态方法
Optional
Streams
并行数组
Lambda表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。可以使代码变的更加简洁紧凑。
⒈基本语法
(参数列表) - {代码块}
需要注意:
参数类型可省略,编译器可以自己推断
如果只有一个参数,圆括号可以省略
代码块如果只是一行代码,大括号也可以省略
如果代码块是一行,且是有结果的表达式, return 可以省略
注意:事实上,把Lambda表达式可以看做是匿名内部类的一种简写方式。当然,前提是这个匿名内部类对应的必须
是接口,而且接口中必须只有一个函数!Lambda表达式就是直接编写函数的:参数列表、代码体、返回值等信息,
用函数来代替完整的匿名内部类 !
⒈Function类型接口
Function代表的是有参数,有返回值的函数。还有很多类似的Function接口:
看出规律了吗?这些都是一类函数接口,在Function基础上衍生出的,要么明确了参数不确定返回结果,要么明确结果不知道参数类型,要么两者都知道。
⒉Consumer系列
Consumer系列与Function系列一样,有各种衍生接口,这里不一一列出了。不过都具备类似的特征:那就是不返回任何结果。
⒊ Predicate系列
Supplier系列,英文翻译就是 供应者 ,顾名思义:只产出,不收取。所以不接受任何参数,返回T类型结果。
方法引用
方法引用使得开发者可以将已经存在的方法作为变量来传递使用。方法引用可以和Lambda表达式配合使用。
Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。叩丁狼
⒈默认方法
默认方法使得开发者可以在 不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法。
默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。接口提供的默认方法会被接口的实现类继承或者覆写,例子代码如下:
Defaulable接口使用关键字default定义了一个默认方法notRequired()。DefaultableImpl类实现了这个接口,同时默认继承了这个接口中的默认方法;OverridableImpl类也实现了这个接口,但覆写了该接口的默认方法,并提供了一个不同的实现。
⒉ 静态方法
Java 8带来的另一个有趣的特性是在接口中可以定义静态方法,我们可以直接用接口调用这些静态方法。例子代码如下:
下面的代码片段整合了默认方法和静态方法的使用场景:
这段代码的输出结果如下:
由于JVM上的默认方法的实现在字节码层面提供了支持,因此效率非常高。默认方法允许在不打破现有继承体系的基础上改进接口。该特性在官方库中的应用是:给 java.util.Collection 接口添加新方法,如 stream() 、
parallelStream() 、 forEach() 和 removeIf() 等等。
尽管默认方法有这么多好处,但在实际开发中应该谨慎使用:在复杂的继承体系中,默认方法可能引起歧义和编译错误。如果你想了解更多细节,可以参考官方文档。
Optional
Java应用中最常见的bug就是空值异常。
Optional 仅仅是一个容器,可以存放T类型的值或者 null 。它提供了一些有用的接口来避免显式的 null 检查,可以参考Java 8官方文档了解更多细节。
接下来看一点使用Optional的例子:可能为空的值或者某个类型的值:
如果 Optional 实例持有一个非空值,则 isPresent() 方法返回 true ,否则返回 false ;如果 Optional 实例持有null , orElseGet() 方法可以接受一个lambda表达式生成的默认值;map() 方法可以将现有的 Optional 实例的值转换成新的值;orElse() 方法与 orElseGet() 方法类似,但是在持有null的时候返回传入的默认值,而不是通过Lambda来生成。