return originalStr.compareToIgnoreCase(str);
})
| 方法引用 | 等价的lambda表达式 | 说明 |
| — | — | — |
| separator::equals | x->{separator.equals(x)} | 包含一个对象和一个实例方法的方法表达式,lambda参数作为该方法的显示参数传入 |
| String::trim | x->x.trim() | 一个类和一个实例方法的方法表达式,lambda表达式成为隐式参数 |
| String::concat | (x,y)->x.caoncat(y) | 一个类和一个实例方法的方法表达式,lambda表达式第一个参数为隐式参数,第二个为显示参数 |
| Integer::valueof | x->Integer::valueof(x) | 一个类和其静态方法的方法表达式,lambda表达式作为隐式参数传给静态方法 |
| Integer::sum | (x,y)->Integer::sum(x,y) | 一个类和其静态方法的方法表达式,lambda表达式作为隐式参数传给静态方法 |
| Integer::new | x->new Integer(x) | 一个类和其构造器引用,lambda参数作为构造器的隐式参数 |
| Integer[]::new | n->new Integer[n] | 数组构造器的引用,lambda参数作为数组构造器的隐式参数,代表长度 |
[](
)构造方法引用
lambda对于构造方法是自动匹配的,根据所给的参数
举个栗子,准备一个接口,该接口一个有参数,一个没有参数(注意要注释掉其中一个方法,因为函数式接口只能有一个抽象方法)
准备一个类,该类调用该接口去修改本身的属性,分别调用不同方法
![在这里插入 需要zi料+ 绿色徽【vip1024b】
图片描述](https://img-blog.csdnimg.cn/20210526205416971.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dEVVRfVHJpbQ==,size_16,color_FFFFFF,t_70#pic_center)
然后调用以下,结果如下
可以看到,lambda代码块应该传的是有参构造,这是因为接口里面有一个name参数,所以就会变成new Fsy(name),如果我们将接口里面改为无参呢?
变成了如下
可以看到结果变成了NULL,因为接口的抽象方法里面没有参数,就会变成new Fsy(),为无参构造。
[](
)使用总结
-
lambda表达式代表的就是代码块,用来实现想要的参数
-
lambda表达式代表的代码块可以自己自定义,也可以去进行方法引用,甚至可以进行构造器引用
-
使用构造器引用要记得对应,也就是对应接口的参数去执行对应的构造方法
[](
)lambda变量作用域
lambda表达式共有三个部分
-
一个代码块
-
参数
-
自由变量的值,这是指为非参数而且不在代码中定义的变量(也参数不属于lambda,而且在lambda中没有定义,lambda单纯进行引用)
闭包是指:一段代码块可以读另一段代码块的函数,通常以函数区分
lambda表达式的代码块可以读取外围的变量,所以这也可以称为闭包
但Java对这方面是有限制的,lambda读取外围的值,必须明确定义有值,而且只能是不可变的,而且在lambda不可以去进行修改他,比如修改其引用地址,这是为了避免并发执行多个动作造成的不安全现象。
成功示例(字符串不可变,在lambda内没有进行修改操作)
失败示例(没有明确定义有值)
失败示例(变量会发生修改)
[](
)对lambda表达式的处理
使用lambda表达式的重点是延迟执行
也就是只有要使用到lamdba的代码块实现的接口方法才会去执行lambda生成对应接口,即实现了要用到才会去生成
假如有一个日志操作为
public class Demo01Logger {
private static void log(int level, String msg) {
if (level == 1) {
System.out.println(msg);
}
}
public static void main(String[] args) {
String msgA = “Hello”;
String msgB = “World”;
String msgC = “Java”;
log(1, msgA + msgB + msgC);
}
}
最后
由于篇幅限制,小编在此截出几张知识讲解的图解
XMf-1710354261373)]
[外链图片转存中…(img-twb78srt-1710354261374)]
[外链图片转存中…(img-hyQ3N4Nt-1710354261374)]
[外链图片转存中…(img-lyPh8Q2Q-1710354261375)]
[外链图片转存中…(img-MI4j9qJH-1710354261376)]