持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6 天,点击查看活动详情
简介
lambda表达式可以用非常少的代码实现抽象方法。lambda表达式不能独立执行,因此必须实现函数式接口没并且会返回一个函数式接口的对象。lambda表达式的语法非常特殊,语法格式如下:
()->结果表达式
参数->结果表达式
(参数1,参数2,参数3....,参数n)->结果表达式
第一行实现无参方法,单独写一对圆括号表示方法无参数,操作符右侧的结果表达式表示方法的返回值。
第二行实现只有一个参数的方法,参数可以写在圆括号里,或者不写圆括号。
第三行实现多参数的方法,所有参数按照顺序写在圆括号里,且圆括号不可以省略。
lambda表达式也可以实现复杂的方法,将操作符右侧的结果表达式换成代码块即可,语法格式如下:
()->{代码块}
参数->{代码块}
(参数1,参数2, ... , 参数n)->{代码块}
与上述方法基本一致。
实现函数式接口
1、函数式接口
函数式接口是指仅包含一个抽象方法的接口,接口中的方法简单明了地说明了接口的用途,如线程接口runnable、多做事件监听接口ActionListener等。也可以自定义函数式接口,如:
public interface MyInterface{
void method();
}
如果接口中包含一个以上的抽象方法,则不符合函数式接口的规范,这样的接口不能用lambda表达式创建匿名对象。
2、无参抽象方法
很多函数式接口的抽象方法都是无参的,如线程接口Runnable接口只有一个run()方法,这样的午餐抽象方法在lambda表达式中用“()”表示。例如:
public interface SayHiInterface{
String say();
}
public class Demo {
public static void main(String[] args) {
SayHiInterface pi = ()->"你好,hello world";
System.out.println(pi.say());
}
}
运行结果如下:
你好,hello world
有参抽象方法
抽象方法中有一个或多个参数的函数式接口也很常见,lambda表达式可以用“(a1,a2,a3)”的方法表示有参抽象方法,圆括号里标识符对应的抽象方法的参数。如果抽象方法中只有一个参数,lambda表达式可以省略圆括号。例如:
public interface AdditionInterface{
int add(int a, int b);
}
public class Demo {
public static void main(String[] args){
AddtionInterface np = (x, y)->x+y;
int result = np.add(5,6);
System.out.println("相加结果:"+result);
}
}
运行及结果如下:
相加结果:11
4、使用代码块
当函数式接口的抽象方法需要实现复杂逻辑而不是返回一个简单的表达式的话,就需要使用代码块。例如:
public interface CheckGrade{
String check(int grade);
}
public class Demo{
public static void main(String[] args){
CheckGrade g = (n)->{
if(n>=90 && n<=100){
return "优";
}else if(n>=80 && n<90){
return "良";
}else if(n>=60 && n<80){
return "中";
}else if(n>=0 && n<60){
return "差";
}else{
return "成绩无效";
}
};
System.out.println(g.check(89));
}
}
运行结果如下:
良