函数式接口:
如果接口中只有一个抽象方法(包括继承的),则该接口是一个函数式接口。 下面的SmartAdder 就不是函数式接口,因为它有两个add方法(继承一个)
public interface Adder{
int add(int a, int b);
}
public interface SmartAdder extends Adder{
int add(double a, double b);
}
还可以使用FunctionalInterface注解来限定接口内只能有一个抽象方法。
@FunctionalInterface
public interface FunctionalInterfaceTest {
void print();
}
lambda表达式:只能使用函数式接口
public static void main(String[] args) {
// 使用匿名内部类实现
FunctionalInterfaceTest fit=new FunctionalInterfaceTest() {
@Override
public void print() {
System.out.println("使用匿名内部类实现");
}
};
fit.print();
// 使用Lambda表达式实现
// ():表示参数列表
// ->:连接符
// {}:方法体
FunctionalInterfaceTest fit1 = () -> {
System.out.println("使用Lambda表达式实现");
};
fit1.print();
// 如果方法体只有一句话,还可以省略大括号及一个分号
FunctionalInterfaceTest fit2 = () -> System.out.println("使用更简洁的Lambda表达式");
fit2.print();
}
public static void main(String[] args) {
// Lambda表达式有一个参数
FunctionalInterfaceTest fit3 = (x) -> {
System.out.println("一个参数:"+x);
};
fit3.print(12);
// 如果只有一个参数可以省略圆括号,还可省略掉大括号
FunctionalInterfaceTest fit4 = x -> System.out.println("一个参数更简洁:"+x);
fit4.print(22);
}
有两个及以上参数,圆括号不可省略 方法体有两行及以上代码时,大括号不可省略。 有返回值
public static void main(String[] args) {
// Lambda表达式有返回值
FunctionalInterfaceTest fit3 = (x,y) -> {
return x+y;
};
int c = fit3.add(12,11);
System.out.println(c);
// 因为方法体只有一条语句,可以省略大括号
// 注意在省略大括号时,将return关键字一块省略,如下
// 对于有返回值的情况,大括号和return关键字是一块出现一块消失的。
FunctionalInterfaceTest fit3 = (x,y) -> x+y;
}