先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
}
在sort方法开始运行时,便会调用compare()方法进行比较,实际上,调用的就是compare中的return o1.length()-o2.length();这段代码。
从上面两个例子,也许你能够发现相似点,就是都是将一段代码传递给了某个对象,第一个例子的Timer,第二个例子的sort方法。这段代码块不会立即调用,而是在未来的某一个时刻调用。
- 此时也许你已经发现了问题,java中传递一各代码段太复杂了!!!为了一段代码,我们需要构造一个对象!
2. Lamda简介
由于上面的原因,lamda表达式便提出了,并在java1.8正式引入!
2.1 组成元素
运算符:->
左侧:指定了Lambda表达式所需要的所有参数
右侧:制定了Lambda体,即Lambda表达式所要执行的功能。
话不多说,直接上例子吧,我们前面已经说明了,没有lambda表达式之前,java中传代码段必须要创建对象,那么使用了lambda表达之之后呢?我们来看一下定时器函数:
public class TestTimer {
public static void main(String[] args) {
// lambda表达式
Timer timer = new Timer(1000,(event)-> System.out.println(“我是测试Timer的Lambda版本!”));
timer.start();
JOptionPane.showMessageDialog(null,“Quit”);
System.exit(0);
}
}
看到差别了吗?一句话就能搞定,其中->左侧能够看到,有一个参数event,有人会说,这里后面就一个打印语句,也没有用到参数event啊,可以删除吗?这是不可以的哈!!!具体原因我们后面再分析。下面来看一下第二个sort函数使用lambda表达式之后是什么样:
public class TestString {
public static void main(String[] args) {
String[] strings = new String[]{
“1”,“22”,“1111”,“333”};
Arrays.sort(strings,(s1,s2)->{
return s1.length()-s2.length();});
for (String s :strings){
System.out.println(s);
}
}
}
怎么样?很方便吧!这里同样的,有两个参数,而且还有返回值,我们接下来聊一下参数问题哈!
2.2 lambda表达式中的参数问题
我们还是先看上面那两个例子哈,在没替换之前,我们是怎么搞的?那定时器那个为例:是不是要先定义一个TimerPrinter对象,然后将这个对象传到定时器里:如下TimePrinter 对象:
class TimePrinter implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(“我是测试Timer的!”);
}
}
我们再来仔细看一下这个对象,里面实现了一个方法,actionPerformed(ActionEvent e),前面也已经说了,传递给定时器的,就是方法中的这段打印信息的代码,我们现在使用Lambda表达式来完成同样的任务,是不是就要和这个方法对应呢?即:
-
参数对应,这里有个参数,那对应的lambda表达式也要有对应的参数。
-
方法为void,那对应的lambda表达式就不需要有return返回值。
到这里,其实就大致能看出,在定时器这里的lambda表达式,其实就是实现了ActionListener中的actionPerformed方法,我们可以debug以下:
设置断点如下:
在listenerList中我们能够看到其中一个listener是我们定义的lambda生成的!
同样的,我们在sort排序中,是不是在没有使用lambda表达式之前创建了一个LenghtCom对象,该对象实现了Comparator接口,并重写了一个public int compare(String o1, String o2)方法,注意了哈,这里这个方法是有返回值的,int类型的,并且有两个String类型的参时。那么,同样的,在我们实现的Lambda表达式中,
Arrays.sort(strings,(s1,s2)->{
return s1.length()-s2.length();});
同样有两个参数s1和s2,和一个return返回值为int。这里s1和s2你也可以带上String声明,就类似如下:
Arrays.sort(strings,(String s1,String s2)->{
return s1.length()-s2.length();});
都是没关系的,lambda在特定情况下能够智能推断出你的参数类型,所以这里不加String声明也可以正常运行。
3 如何定义一个可以使用lambda表达式的对象?
讲到这里,相信大家对lambda表达式已经有一定的了解了,但是是不是所有的对象方法都可以使用lambda表达式呢?答案肯定是否定的,不信你可以试试!!!那什么时候可以用呢?或者说,如何定义一个可以使用lambda表达式的对象方法呢?别着急,我这就介绍!!!
3.1 函数式接口
在自定义可以使用lambda表达式的方法时,需要先搞清楚什么是函数式接口,这点特别重要,不过也很容易理解。
函数式接口:只有一个抽象方法的接口。
怎么样?很容易理解吧?比如下面这个接口:
public interface TestConsumer {
void accept(int value);
}
对喽,这就是一个函数式接口!!!
3.2 自定义函数式接口测试lambda表达式
现在,我们就可以测试接口了,就用TestConsumer 这个接口为例吧!
现在编写测试类:
package com.mark.spDefault.controller.test;
/**
* @author:guan
* @2021/12/7 17:23
* 文件信息:
*/
public class testLambda {
public static void repeat(int n,TestConsumer testConsumer){
for (int i=0;i<n;i++){
testConsumer.accept(i);
}
}
public static void main(String[] args) {
}
}
testLambda类里有一个类方法:repeat,里面循环调用TestConsumer 接口的accept()函数。
现在我们写main函数:
public static void main(String[] args) {
repeat(10,new TestConsumer() {
@Override
public void accept(int value) {
System.out.println(“test”);
}
});
}
笔者福利
以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-1713613431113)]
[外链图片转存中…(img-Bh71BzYl-1713613431113)]
[外链图片转存中…(img-GXi0u88c-1713613431114)]
[外链图片转存中…(img-HlRjVusT-1713613431114)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-aMvRvvD4-1713613431115)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!