Java8新特性(上)
2018/08/08 15:39 分类: 技术交流 浏览:101
1. 课程介绍
Ø 1. 接口默认方法
Ø 2. 函数式接口
Ø 3. Lambda表达式
Ø 4. Lambda表达式的作用域
Ø 5. 方法引用
2. 接口的默认方法
接口中的默认方法主要就是接口这种语法结构本身的语法特点,所以大家根据特点和提示熟悉就好,在以后的应用中慢慢去感受它的好处。
2.1 传统的方法(之前的)
在Java8之前Java中接口里面的方法默认都是public abstract 修饰的抽象方法并且没有方法体;
2.2 static方法
1、使用static修饰接口中的方法并且必须有主体;
2、接口的static方法只能够被接口本身调用;接口名.方法名(...);
3、接口的static方法不能够被子接口继承;
4、接口的static方法不能够被实现类覆写及直接调用;
2.3 default方法
在接口中可以定义一个使用default修饰有方法体的方法,接口中可以对这个方法提供默认的一种实现。
1、使用default修饰接口中的方法并且必须有主体;
2、接口的default方法不能够被接口本身调用,需要接口的实例(实现类对象)来调用;
3、接口的default方法可以备子接口继承、覆写或者直接调用;
4、接口的default方法可以被实现类覆写及直接调用;
3. 函数式接口3.1 什么是函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为lambda表达式。
3.2 函数式接口API
JDK 1.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
JDK 1.8 新增加的函数接口:
java.util.function 此包中包含了很多类,用来支持 Java的 函数式编程
3.3 函数式接口注解
@FunctionalInterface
我们在函数式接口上面加上此注解后,里面就只能够有一个抽象方法了,当然不加此注解且只有一个抽象方法的接口也是函数式接口,只是没有限定提示而已。
4. Lambda表达式4.1 什么是Lambda表达式
简单来说:可以看成是对匿名内部类的简写,使用Lambda表达式时,接口必须是函数式接口。
4.2 Lambda表达式的语法
基本语法:
<函数式接口> <变量名> = (参数1,参数2...) -> {
//方法体
}
特点说明:
(参数1,参数2…)表示参数列表;->表示连接符;{}内部是方法体
1、=右边的类型会根据左边的函数式接口类型自动推断;
2、如果形参列表为空,只需保留();
3、如果形参只有1个,()可以省略,只需要参数的名称即可;
4、如果执行语句只有1句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
5、形参列表的数据类型会自动推断;
6、lambda不会生成一个单独的内部类文件;
7、lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,此后在修改该局部变量,会报错;
1、=右边的类型会根据左边的函数式接口类型自动推断;
2、如果形参列表为空,只需保留();
3、如果形参只有1个,()可以省略,只需要参数的名称即可;
4、如果执行语句只有1句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
5、形参列表的数据类型会自动推断;
6、lambda不会生成一个单独的内部类文件;
7、lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,此后在修改该局部变量,会报错;
4.3 学习过程(一个案例学会Lambda)
1、一个类实现一个接口基本写法
接口:
实现类:
测试类:
2、匿名内部类的写法
3、使用Lambda写法一:常规写法
我们可以看成是把函数式接口中唯一的实现方法的核心: 方法列表和方法体抽取出来
4、使用Lambda写法二:两个参数有返回值的简写
5、使用Lambda写法三:一个参数没有返回值的简写
测试如果只有一个参数的简写
接口:
测试类:
6、使用Lambda写法四:没有参数的简写
测试如果函数式接口中的方法没有参数
接口:
测试类:
4.4 Lambda 作用域
在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。但如果访问局部变量,要求局部变量必须是final修饰的。
注意:上面代码中一旦匿名内部类中使用了i,则第5行的i会自动被编辑为final的
下面我们可以看到使用Lambda表达式和上面一样的
5. 方法引用5.1 构造方法引用
1、准备一个一个Person类,提供一个两个参数的构造方法
2、准备一个创建Person对象的工厂函数式接口,提供一个获得Person对象的抽象方法
3、使用匿名内部类的方式创建一个工厂的实例
4、使用Lambda表达式简写一:
5、使用Lambda表达式简写二:
5.2 静态方法引用
1、准备一个函数式接口,提供一个解析字符串为int的方法
2、测试
5.3 实例方法引用
1、了解Java1.8提供了一个函数式接口Function,接受两个参数
2、匿名内部类方式
3、Lambda表达式常规写法
4、Lambda表达式简写
小结: 我们看到Java8提供的Function函数式接口其实通用性非常强大,想了解更多关于它的用法,请持续关注我们后面的更新,谢谢!
感谢源码时代教学讲师提供此文章!
本文为原创文章,转载请注明出处!
赞 0