函数式接口:
- 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
- 如果我们在某个接口上申明了FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口
- 如果某个接口只有一个抽象方法,但我们并没有给该接口申明FunctionalInterface 注解,那么编译器依旧会将该接口看作是函数式接口
- 如果一个接口中抽象方法是重写了object的公有方法,那么此方法不给抽象方法加一,什么意思呢?比如,我们写了一个接口,但是接口里面有两个抽象方法,一个是 void add(),一个是 String toString();由于java.lang.Object里面是有toString()方法的,所以这个接口还是符合函数式接口的,即只有一个抽象方法,虽然我们在接口中定义了两个抽象方法。
Lambda 表达式是基于函数式接口的。
Lambda 表达式的基本语法:()-> { } 或者(a,b)->{} ,总共分为三部分,即()、-> 、{} ;
其中小括号代表函数式接口的参数,没有可以留空括号,花括号代表接口的实现方法体。
public class mianshi {
@FunctionalInterface
public interface addTest { //自定义了一个函数式接口
Integer sd(Integer a, Integer b);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a1 = scanner.nextInt();
int b1 = scanner.nextInt();
addTest addTest1 = (a, b) -> { //使用lambda表达式实现
if (a > b) {
return a + b;
} else {
return a - b;
}
};
System.out.println(addTest1.sd(a1, b1));
}
}
public static void main(String[] args) {
List<Integer> arrayList = Arrays.asList(1, 2, 3, 4, 5, 6);
arrayList.forEach(new Consumer<Integer>{
@Override
public void accept(Integer integer){
System.out.println(integer);
}
});
arrayList.forEach(i -> System.out.println(i)); //由于Consumer是一个函数式接口,可用lambda表达式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello eaphy1 !");
}
}).start();
new Thread(() -> System.out.println("Hello eaphy2 !")).start(); //由于Runnable是一个函数式接口,可用lambda表达式
}