java8新特性

接口的默认方法

传统的方法
在java8之前Java中接口里面的方法默认都是public abstract 修饰的抽象方法并且没有方法体
java8中接口允许与static方法和default方法.

Java8新特性
Static方法
1.使用static修饰接口中的方法并且必须有主体
2.接口的static方法只能被接口本身调用:接口名.方法名(…)
3.接口的static方法不能被子接口继承
4.接口的static方法不能被实现类复写及直接调用

Default方法
1.默认方法必须有方法体
2.默认方法能被子接口继承
3.默认方法能被实现类复写及直接调用
java8新特性
java8新特性
java8新特性java8新特性
java8新特性
java8新特性

函数式接口

什么是函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以被隐式转换为lambda表达式.函数式接口可以用@FunctionlInterface注释
java8新特性
函数式接口API
JDK1.8之前已有的函数式接口:
Java.lang.Runnable
Java.util.concurrent.Callable
Java.security.PrivilegedAction
Java.util.Comparator
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的函数式编程

Lambda表达式

什么是Lambda表达式
简单来说,可以看成是对匿名内部类的简写,使用Lambda表达式时,接口必须是函数式接口

Lambda表达式的语法
基本语法:
(formal parameter list) -> { expression or statements }
参数列表:
1.参数列表是一个逗号分隔的形式参数列表,这些参数与功能接口中单一方法的形式参数相对应。
2.参数列表中的参数类型是可选项,如果未指定参数类型,将从上下文推断。
3.参数列表必须用小括号括起来,但如果只有一个参数且不带参数类型时小括号可以省略。
4.参数列表如果为空(即:功能接口方法没有形式参数),则必须指定空括号。
Lambda 主体根据以下选项之一返回结果:
5.如果 lambda 主体是单一表达式,则返回表达式的值(如果有的话)。
6.如果功能接口方法的结果是 void,可以提供一个 return 语句,但这不是必需的。
7.如果功能接口方法具有返回类型,且 lambda 主体不是单一表达式,则 lambda 主体必须使用 return 语句返回匹配的值。
语句块必须包含在大括号内,除非语句块是一个方法调用语句,且功能接口方法的返回结果是void。
Lambda 表达式实际上是一种匿名方法实现,指定形式参数,并使用 return 语句返回值。匿名方法必须按照以下规则所规定的与其实现的功能接口方法兼容。
8.Lambda 表达式返回的结果必须与功能接口方法的结果兼容。返回值的类型可以是功能接口方法声明中返回类型的子类型。
9.Lambda 表达式签名必须与功能接口方法的签名相同。
10.Lambda 表达式只能抛出那些在功能接口方法的 throws 子句中声明了异常类型或异常超类型的异常。

两个参数,有返回值:
java8新特性
java8新特性

一个参数,无返回值:
java8新特性
java8新特性

无参无返回值:
java8新特性
java8新特性
Lambda表达式 作用域
在Lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似,可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量.但如果访问局部变量,要求局部变量必须是final修饰的
java8新特性
注意:上面代码中一旦匿名内部类使用了age变量,则age会自动被编译为final修饰的
下面使用Lambda表达式和上面是一样的:
java8新特性
方法引用
方法引用通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
方法引用使用一对冒号 :: 。

构造方法引用(它的语法是Class::new,或者更一般的Class< T >::new)
java8新特性
java8新特性
java8新特性

静态方法引用(它的语法是Class::static_method)
java8新特性
java8新特性

实例方法引用
java8新特性