java8有什么变化?本文将讲解Java8的九个新特点,即Java8Lambda表达式、Java8引用方法、Java8函数接口、Java8默认方法、Java8Nashorn、JavaScript、Java8Stream、Java8optional。
一、Java8Lambda表达式。
Lambda表达式,也称为闭包,是促进Java8发布的最重要的新特征。Lambda允许函数作为方法的参数(函数作为参数传输到方法中)。
Lambda表达式可以使代码更加简洁紧凑。
1.语法
lambda表达式语法格式如下:(parameters)->expression或(parameters)->{statements;}
以下是lambda表达式的重要特征:
可选类型声明一识别参数值,无需声明参数类型。
可选参数圆括号:一个参数不需要定义圆括号,但多个参数需要定义圆括号。
大括号:如果主体包含一个句子,则不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值,编译器将自动返回值,大括号需要指定表达式返回值。
2.变量作用域。
lambda表达式只能引用标有final的外部局部变量,即lambda内部不能修改定义在域外的局部变量,否则会编译错误。
引用Java8方法:
该方法通过该方法的名称引用该方法。该方法的引用可以使语言结构更加紧凑和简减少冗余代码。该方法引用了一对冒号:
三、Java8函数接口。
函数接口(Functionalinterface)是一种只有一种抽象方法的接口,但可以有多种非抽象方法。
函数接口可以隐式转换为lambda表达式。
现有的函数可以友好地支持lambda。
JDK1.8之前现有的函数接口:
java.lang.runnable。
java.util.concurrent.callable。
java.security.Privilegedaction。
java.util.comp。
arator。
java.io.FileFilter。
java.nio.file.pathmatcher。
java.lang.reflect.InvocationHandler。
java.beans.propertychangelistener。
java.awt.event.actionlistener。
javax.swing.event.changelistener。
JDK1.8新增函数接口:
java.util.function。
Java.util.function包含多种类型,用于支持Java的函数编程。
四、Java8默认方法。
Java8增加了接口默认方法。
简单来说,默认方法是界面可以实现,不需要实现类来实现。
只需在方法名前添加default关键字即可实现默认方法。
为什么要有这个特点?
首先,之前的界面是一把双刃剑,其优点是抽象而不是特定的编程。缺点是,当需要修改界面时,需要修改所有实现界面的类别。目前,java8之前的集合框架没有foreach方法。通常,可以想到的解决方案是在JDK中为相关界面添加新的方法和实现。然而,对于已发布的版本,在不影响现有实现的情况下,不能在不影响现有实现的情况下添加新的方法。因此,引入默认方法。其目的是解决接口修改与现有实现不兼容的问题。
5.Java8Stream。
Java8API添加了一种新的抽象,称为流Stream,可以让您以声明的方式处理数据。
Stream利用SQL语句从数据库查询数据的直观方式,为Java集合运算和表达提供高级抽象。
StreamAPI可以大大提高java程序员的生产力,让程序员写出高效、干净、简洁的代码。
这种风格将要处理的元素集合视为一种流动,流动在管道中传输,并可在管道节点上进行处理,如筛选、排序、聚合等。
元素流在管道中,经过中间操作(intermediateoperation)处理,最终通过最终操作(terminaloperation)获得前处理结果。
六、Java8optional类。
Optional类是一个可以是null的容器对象。如果值存在,ispresent()方法将返回true,调用get()方法将返回对象。
Optional是一个容器:它可以保存类型T的值,或者只保存null。Optional提供了许多有用的方法,这样我们就不需要显式的空值检测。
引入Optional类可以很好地解决空指针异常。
7.Java8NashornJavaScript。
javascript引擎Nashorn。
从JDK1.8开始,Nashorn取代Rhino(JDK1.6、JDK1.7)成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript5.1规范和一些扩展。
基于JSR292的新语言特征,包括JDK7引入的invokedynamic,将JavaScript编译成Java字节码。
与之前的Rhino相比,这带来了2到10倍的性能提升。
8.Java8日期API。
Java8通过发布新的Date-TimeAPI(JSR310)来进一步加强对日期和时间的处理。
在旧版Java中,日期时间API存在许多问题,包括:
非线程安全:Java.util.Date是非线程安全的,所有日期类都是可变的,这是Java日期类最大的问题之一。
设计很差:Java的日期/时间定义不一致,Java.util和Java.sql包中有日期类,Java.text包中定义用于格式化和分析的类。
java.util.date还包含日期和时间,而java.sql.date只包含日期,将其纳入java.sql包是不合理的。这两类都有相同的名字,这本身就是一个非常糟糕的设计。
时区处理麻烦:日期类不提供国际化,没有时区支持,所以Java引入了Java.util.calendar和java.util.timeZone,但他们也有上述所有问题。
Java8在Java.time:包下提供了许多新的API。以下是两个重要的API:
Local(本地):日期时间处理简化,无时区问题。
Zoned(时区):通过制定时区。