目录
一.什么是函数式接口
1.定义
函数式接口是只有一个抽象函数的接口。例如:
线程常用的Runnable接口只有一个run()方法,就是一个典型的函数式接口。
2.相关问题:
使用函数式接口需要定义一个类,再实现该接口;再实例化对象,通过对象调用接口的方法。这是相当麻烦的。
//最传统方法
public class Demo {
public static void main(String[] args) {
//2 实例化对象,通过对象调用方法
new Dog().cry();
}
}
// 1 需要定义一个类,实现该接口
class Dog implements Animal{
@Override
public void cry() {
System.out.println("小狗汪汪叫...");
}
}
interface Animal{
void cry();
}
二.使用匿名内部类简化函数式接口使用
//匿名内部类简化实现函数式接口
public class Demo {
public static void main(String[] args) {
// 直接定义匿名内部类实现Animal接口
Animal dog = new Animal(){
public void cry(){
System.out.println("小狗汪汪叫...");
}
};
dog.cry();
}
}
interface Animal{
void cry();
}
三.lambda表达式简化函数式接口使用
1.简化普通函数式接口
//lambda表达式简化函数式接口
public class Demo {
public static void main(String[] args) {
Animal dog = ()->{
//重写cry()方法
System.out.println("小狗汪汪叫...");
};
dog.cry();
}
}
interface Animal{
void cry();
}
简单比较就可以发现lambda表达式更加简洁。由于函数式接口只有一个抽象方法确实可以省略函数名称的定义,方法体肯定是对抽象方法的重写。
2.简化带有参数的函数式接口
当然Lambda在带有参数的函数式接口中还可以更加简化。
//lambda表达式简化带参数的函数式接口
public class Demo {
public static void main(String[] args) {
// 正常lambda表达式
Animal dog = (String name)->{
System.out.println(name + "汪汪叫...");
};
dog.cry("旺财");
/*
进一步简化
1 简化参数类型
2 简化掉小括号(仅函数只有一个参数时可用)
3 简化掉大括号(仅方法体只有一行代码时可用)
*/
Animal cat = name->System.out.println(name + "喵喵喵...");
cat.cry("小花");
}
}
interface Animal{
void cry(String name);
}
如果有所帮助还请点赞,不尽感谢!