Lambda表达式的优势
- Lambda表达式的优势主要在于可将复杂的函数式接口相对复杂的匿名内部类代码简化,且更为直观
函数式接口:只有一个抽象方法的接口
匿名内部类:类似new Random().nextInt(999)
; 能够高效地使用某类中得某一个方法
使用条件
- 函数式接口的调用
使用方法
- (参数列表) -> {代码块}
使用例子
//给定一个厨子 Cook 接口,内含唯一的抽象方法 makeFood ,且无参数、无返回值。如下:
public interface Cook { void makeFood(); }
//在下面的代码中,请使用Lambda的标准格式调用 invokeCook 方法,打印输出“吃饭啦!”字样:
public class Demo05InvokeCook {
public static void main(String[] args) {
// TODO 请在此使用Lambda【标准格式】调用invokeCook方法
}
==这里是方法的定义,是invokeCook方法如何利用cook类对象方法的动作==
private static void invokeCook(Cook cook) { cook.makeFood(); }
}
- 注意:Lambda表达式是在调用方法时使用
//上方该插入的内容
==这里是方法参数cook类的写入,是cook方法的动作==
public static void main(String[] args) {
invokeCook(() ‐> { System.out.println("吃饭啦!");});
}
Lambda的继续精简省略
1.可省略(参数列表)参数列表中参数的类型声明符号
2.当无参数时不能省略()
3.当只有一个参数时,可省略()
4.当{代码块}
代码块中只有一行代码时,要么同时省略大括号、return、分号,要么一个都不要省略
例子:
public static void main(String[] args) {
invokeCook(() ‐> { System.out.println("吃饭啦!");});
}
//精简后
public static void main(String[] args){
invokeCook(()-> System.out.println("吃饭了!"));//省略了大括号,return(这里原本就没有)和分号
}
可以这样理解:
()->System.out.println("吃饭了!"))
作用上等同于invokeCook
函数体中的cook.makeFood();
new cook(){ @Override public void makeFood(){...}}
内容上等同于()->{...}
Lambda的延迟加载机制
对比(未使用延迟加载)
==函数定义==
public void showMessage(int level, String message){
if(level == 1) System.out.println(message);
}
==函数调用==
String a = "123";
String b = "234";
showMessage(1,a+b); -当level是1时,先运行a+b后运行showMessage()-
showMessage(0,a+b); -当level是0时,虽然不能打印出任何信息但是还是会先a+b后运行showMessage() 进行判断,所以这样导致了资源的浪费-
对比(使用Lambda进行延时加载)
==函数定义==
public void showMessage(int level, Info message){
if(level==1) System.out.println(message.showMessage());
}
==函数式接口定义==
interface Info{
public abstract String showMessage(); //接口有且仅有一个抽象方法,里面的内容等待Lambda表达式进行定义
}
==Lambda写法调用==
String a = "123";
String b = "234";
showMessage(1,()->{return a+b;}); //化简 showMessage(1,()->a+b);
showMessage(0,()->a+b); -(延迟体现)这时就会先判断是否是1,如果不是就不会运行a+b;-
注解:这里也比较好理解,lambda实质上在这里还是匿名内部的简化形式,看函数定义的代码,如果
level
不等于1的话就不会运行message.showMessage()
,也就不会计算a+b
;