5-匿名类、Lambda
1.匿名类
- 当接口、抽象类的实现类,在整个项目中只用过一次,建议使用匿名类。
抽象类的实现类举例:
1 | // 抽象类的实现类 |
接口举例:
1 | public interface Eatable{ |
调用Persion的eat方法的两种方式:
方式一:
1
2
3
4
5persion.eat(new Eatable(){
public String name(){
return "匿名类";
}
});方式二:
1
2
3
4
5
6
7Eatable e = new Eatable(){
public String name(){
return "匿名类";
}
};
persion.eat(e);
1.1.匿名类的使用注意:
- 匿名类不能定义除编译时常量以外的任何static成员。
- 匿名类只能访问final 或 有效final的局部变量。
- 匿名类可以直接访问外部类中的所有成员(即使被声明为private)
- 匿名类不能自定义构造方法,但可以有初始化块(无类名也就无法定义构造方法)
1.2.匿名类的常见用途:
- 代码传递
- 过滤器
- 回调
匿名类用用途1 - 代码传递
写个可统计下列代码执行时间的工具类
1 | for(int i = 0; i < 1000; i++){ |
1 | //工具类 |
匿名类用用途2 - 回调(请求一个链接,请求成功/失败 会调用对应的方法)
1 | public class NetworkUtils{ |
匿名类用用途3 - 过滤器(传个文件夹,返回此文件夹下的所有文件)
1 | public class FileUtils{ |
Arrays.sort() 源码也使用了匿名类
数组排序:java.util.Arrays
1 | Integer[] arr = {22, 55, 11, 44, 33}; |
2.Lambda
- 函数式接口(Functional Interface): 只包含一个抽象方法的接口。
建议在接口上加 @FunctionalInterface 注解,表示此接口是函数式接口。1
2
3
4
public interface Filter{
boolean accept(String filename);
}
- 当匿名类实现的是函数式接口时,可用Lambda表达式进行简化。
Lambda表达式写法1
2
3
4
5
6(参数列表) -> { // 参数列表:函数式接口里面唯一的那个方法的参数列表
// 函数式接口里面唯一的那个方法
// 里面需要写的东西,都写在这里
// return xxx; 若唯一的那个方法有返回值,这里要写return
// 如果花括号中只有一个语句,可以省略花括号
}
2.1.举例一
1 | // 工具类 |
2.1.举例二
1 | FileUtils.getAllFileNames("F:/", new filter(){ |
lambda表达式推导:
1 | // 1.定义一个接口 |
3.方法引用
方法引用是调用特定方法的Lambda表达式的一种快捷写法。
可以让你重复使用现有的方法定义,就像lambda一样传递他们。
1 | Stu :: getStuName() |
3.1.指向 静态方法 的方法引用
1 | (args) -> ClassName.staticMethod(args); |
3.2.指向 任意类型实例方法 的方法引用
1 | (args) -> args.instanceMethod(); |
3.3.指向 现有对象的实例方法 的方法引用
1 | (args) -> object.instanceMethod(args); |