匿名类,简单说就是不显式地通过定义类实现接口,直接new接口并实现接口方法得到接口的实例,省去了实现类这一步。
public class Test {
public static void main(String[] args) {
// 匿名类创建接口对象
Fun fun = new Fun() {
@Override
public int add(int x, int y) {
return x+y;
}
@Override
public int minus(int x, int y) {
return x-y;
}
};
// 通过接口对象调用匿名类实现的接口方法
System.out.println(fun.add(2,3));
System.out.println(fun.minus(2,3));
}
}
interface Fun{
int add(int x, int y);
int minus(int x, int y);
}
当接口中有且仅有一个抽象方法,这中接口被称为函数接口,它们的实例被称为函数对象
函数接口的实例化可以使用Lambda来代替匿名类,看上去更加简洁,不需要声明Lambda的类型、参数类型、返回值类型,编译器会利用类型推导,根据上下文推断得到。
public class Test {
public static void main(String[] args) {
// 匿名类创建函数对象
// Fun fun = new Fun() {
// @Override
// public int add(int x, int y) {
// return x+y;
// }
// };
// Lambda表达式简化代码
Fun fun = (x, y) -> x+y;
// 通过函数对象调用匿名类实现的接口方法
System.out.println(fun.add(2,3));
}
}
// 函数接口
interface Fun{
int add(int x, int y);
}
Lambda表达式如果过长就会显得代码可读性不强,这个时候可以通过方法引用来代替Lambda表达式。
public class Test {
public static void main(String[] args) {
// 匿名类创建函数对象
// Fun fun = new Fun() {
// @Override
// public int add(int x, int y) {
// return x+y;
// }
// };
// Lambda表达式简化代码
// Fun fun = (x, y) -> x+y;
// 使用方法引用代替Lambda
Fun fun = Test::funAdd;
// 通过函数对象调用匿名类实现的接口方法
System.out.println(fun.add(2,3));
}
// 对应函数接口抽象方法,要求保证输入参数个数类型和返回类型一致
public static int funAdd(int i, int j){
return i+j;
}
}
// 函数接口
interface Fun{
int add(int x, int y);
}
总结:
1. 如果接口中有多个抽象方法,可以使用匿名类实例接口对象并实现接口方法。
2. 如果接口中只有一个抽象方法,可以使用Lambda表达式代替匿名类创建接口对象并实现接口方法;
3. 如果接口方法实现比较复杂,会让Lambda表达式的可读性不强,代码不够清晰易懂,可以通过方法引用代替Lambda表达式,被引用的方法要求参数个数类型和返回值类型一致。