1.接口的默认方法
1.1 传统的方法
在java8 之前java中接口里面的方法默认都是public abstact 修饰的抽象方法并且没有方法体。
1.2 static方法
1.使用static修饰接口中的方法并且必须有主体;
2.接口的static方法只能被接口本身调用:接口名.方法名。
3.接口的static方法不能够被子接口继承;
4.接口的static方法不能够被实现类覆写及直接调用;
1.3 default方法
1.使用default修饰接口中的方法并且必须有主体;
2.接口的default方法能够被子类继承
3.接口的default方法能够被实现覆写及直接调用。
4.接口的default方法不仅仅能够被接口本身调用。
2. 函数式接口
2.1 什么是函数式接口
函数式接口 就是一个有且仅有一个抽象方法。但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为lambda表达式。
2.2 函数式接口API
JDK1.8 之前已有函数式接口:
Java.lang.Runnable
Java.util.concurent.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
Jdk 1.8 新增加的函数接口;
Java.util.function 此包中包含了很多类,用来支持java的函数式编程
3. Lambda表达式
3.1 什么是lambda表达式
简单来说:可以看成是对匿名内部类的简写,使用lambda表达式时,接口必须是函数式接口。
3.2 Lambda表达式格式
4. lambda表达式的作用域
在lambda表达式中访问外层作用域和老版本的匿名对象中的方式相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。但如果访问局部变量,要求局部变量必须是final修饰的。
注意:上面代码中一旦匿名内部类中使用了age,age会被自动编辑为final的,lambda表达式和上面一样的。Age因为为final,所以不能被重新赋值。
5. 方法引用
5.1 构造方法引用
准备一个一个Person类,提供一个两个参数的构造方法
准备一个创建Person对象的工厂函数式接口,提供一个获得Person对象的抽象方法。
使用匿名内部类的方式创建一个工厂的实例。
5.2 静态方法引用
5.3 实例方法引用
了解java1.8提供了一个函数式接口function
小结:我们看到java8提供的function函数式接口其实通用性非常强大。