Java基础复习(DayTen)(1),附架构师必备技术详解

在这里插入图片描述

可以看到它有一个equals方法,是有具体默认实现的,点进去就发现是Object的equals方法,这也是为什么Compartor最后只要去实现compare方法

在这里插入图片描述

Comparator只有compare没有默认实现,所以实现该接口的类只需要重写这个方法即可。

所以Comparator也算是一个函数式接口

所以我们可以用lambda表达式,将代码传给该接口即可

举个栗子,比如Arrays.sort方法

在这里插入图片描述

该方法需要一个泛型数组,然后需要一个Comparator接口,下面使用lambda表达式去实现该接口即可

在这里插入图片描述

所以总的来说,lambda表达式实现了以代码块为参数,利用该代码块实现了一个接口

[](

)方法引用

什么意思呢?lambda表达式可以传代码块,而上面函数式接口的栗子代码块是要自己写的,那能不能去应用其它类的代码块呢?

这是可以的,这种方法也叫做方法引用(引用别人的方法)

举个栗子,在String类上有一个compareToIgnoreCase的方法

在这里插入图片描述

我们可以直接利用它去实现Arrays.sort方法所需的Comparator接口参数

在这里插入图片描述

可能这里就有人疑问了,compareToIgnoreCase所需的参数只要一个,而Comparator的compre方法则需要两个,不是对应不起来吗?

compareToIgnoreCase是一个实例方法,必须实例字符串才可以调用,所以实例的对象也占了一个

//下面这两条语句是等效的

Arrays.sort(array,String::compareToIgnoreCase);

//originalStr代表实例String对象,str代表需要的参数

Arrays.sort(array,(originalStr,str)->{

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对于构造方法是自动匹配的,根据所给的参数

举个栗子,准备一个接口,该接口一个有参数,一个没有参数(注意要注释掉其中一个方法,因为函数式接口只能有一个抽象方法)

在这里插入图片描述

准备一个类,该类调用该接口去修改本身的属性,分别调用不同方法

在这里插入图片描述

在这里插入图片描述

然后调用以下,结果如下

在这里插入图片描述

可以看到,lambda代码块应该传的是有参构造,这是因为接口里面有一个name参数,所以就会变成new Fsy(name),如果我们将接口里面改为无参呢?

变成了如下

在这里插入图片描述

在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210526205538201.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10, 需要zi料+ 绿色徽【vip1024b】

text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dEVVRfVHJpbQ==,size_16,color_FFFFFF,t_70#pic_center)

可以看到结果变成了NULL,因为接口的抽象方法里面没有参数,就会变成new Fsy(),为无参构造。

[](

)使用总结

  • lambda表达式代表的就是代码块,用来实现想要的参数

  • lambda表达式代表的代码块可以自己自定义,也可以去进行方法引用,甚至可以进行构造器引用

  • 使用构造器引用要记得对应,也就是对应接口的参数去执行对应的构造方法

[](

)lambda变量作用域

lambda表达式共有三个部分

  • 一个代码块

  • 参数

  • 自由变量的值,这是指为非参数而且不在代码中定义的变量(也参数不属于lambda,而且在lambda中没有定义,lambda单纯进行引用)

闭包是指:一段代码块可以读另一段代码块的函数,通常以函数区分

Java核心架构进阶知识点

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Java核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、Spring相关、分布式、微服务、RPC、网络、设计模式、MQ、Redis、MySQL、设计模式、负载均衡、算法、数据结构、kafka、ZK、集群等。而这些也全被整理浓缩到了一份pdf——《Java核心架构进阶知识点整理》,全部都是精华中的精华,本着共赢的心态,好东西自然也是要分享的

image

image

image

内容颇多,篇幅却有限,这就不在过多的介绍了,大家可根据以上截图自行脑补
中的精华,本着共赢的心态,好东西自然也是要分享的

[外链图片转存中…(img-5c51c7Pq-1710354211707)]

[外链图片转存中…(img-OgOQv01V-1710354211708)]

[外链图片转存中…(img-YUqjYAFv-1710354211708)]

内容颇多,篇幅却有限,这就不在过多的介绍了,大家可根据以上截图自行脑补

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值