我使用 Lambda 表达式将上百行的代码精简到几行,掌握这十个搜索技巧让你的工作效率至上提高十倍

}

}

public class Main {

public static void main(String[] args) {

// 方式一 直接编写实现类

Human human = new Man();

human.speak();

}

}

如果我们不想编写一个单独的实现类(Man),则可以用匿名内部类。如方式二:

public class Main {

public static void main(String[] args) {

// 方式一 直接编写实现类

Human human = new Man();

human.speak();

// 方式二 匿名内部类

Human human1 = new Human() {

@Override

public void speak() {

System.out.println(“I am woman!”);

}

};

human1.speak();

}

}

但方式二中,有用的就只有System.out.println("I am woman!");这一行,所以有了Lambda表达式,可以这样写,如方式三:

public class Main {

public static void main(String[] args) {

// 方式一 直接编写实现类

Human human = new Man();

human.speak();

// 方式二 匿名内部类

Human human1 = new Human() {

@Override

public void speak() {

System.out.println(“I am woman!”);

}

};

human1.speak();

// 方式三 Lambda表达式

Human human2 = () -> System.out.println(“I am woman!”);

human2.speak();

}

}

2.2 案例二


再假如我们要对一个Student类的数组按指定条件进行过滤,如下:

public class Student {

private String name;

private int age;

private double score;

}

public class Main {

public static void main(String[] args) {

List students = Arrays.asList(new Student(“张三”, 18, 89.5),

new Student(“李四”, 20, 60), new Student(“王五”, 19, 100), new Student(“赵六”, 22, 89));

// 过滤出年龄大于等于20的学生

List stus1 = filterStudentByAge(students);

System.out.println(stus1);

// 过滤出成绩大于80的学生

List stus2 = filterStudentByScore(students);

System.out.println(stus2);

}

// 过滤出年龄大于等于20的学生

private static List filterStudentByAge(List students) {

List stus = new ArrayList<>();

for (Student stu : students) {

if (stu.getAge() >= 20) {

stus.add(stu);

}

}

return stus;

}

// 过滤出成绩大于80的学生

private static List filterStudentByScore(List students) {

List stus = new ArrayList<>();

for (Student stu : students) {

if (stu.getScore() > 80) {

stus.add(stu);

}

}

return stus;

}

}

按上面的方式,如果要按另外一个条件过滤呢,又要写一个方法。那可以用策略模式处理,编写一个抽象策略接口,然后编写多个不同策略类实现它。

// 策略接口

public interface MyPredicate {

boolean test(T t);

}

// 过滤出年龄大于等于20的学生

public class filterStudentByAge implements MyPredicate {

@Override

public boolean test(Student t) {

return t.getAge() >= 20;

}

}

// 过滤出成绩大于80的学生

public class filterStudentByScore implements MyPredicate {

@Override

public boolean test(Student t) {

return t.getScore() > 80;

}

}

public class Main {

public static void main(String[] args) {

List students = Arrays.asList(new Student(“张三”, 18, 89.5),

new Student(“李四”, 20, 60), new Student(“王五”, 19, 100), new Student(“赵六”, 22, 89));

// 过滤出年龄大于等于20的学生

List stus1 = filterStudent(students, new FilterStudentByAge());

System.out.println(stus1);

// 过滤出成绩大于80的学生

List stus2 = filterStudent(students, new FilterStudentByScore());

System.out.println(stus2);

}

// 按myPredicate策略过滤出满足条件的学生

private static List filterStudent(List students,

MyPredicate myPredicate) {

List stus = new ArrayList<>();

for (Student stu : students) {

if (myPredicate.test(stu)) {

stus.add(stu);

}

}

return stus;

}

}

但是以上方式,每增加一个过滤条件,就要编写一个策略类,太麻烦。所以我们就用匿名内部类方式。

// 匿名内部类形式 过滤出年龄大于等于18的学生

List stus3 = filterStudent(students, new MyPredicate() {

@Override

public boolean test(Student t) {

return t.getAge() > 18;

}

});

System.out.println(stus3);

但我们会觉得匿名内部类还是太麻烦,无用代码太多,有用的代码其实就只有return t.getAge() > 18;,于是 Lambda 表达式发挥的作用就来了:

// Lambda形式 过滤出年龄大于等于18的学生

List stus4 = filterStudent(students, t -> t.getAge() > 18);

System.out.println(stus4);

这时还是有人会问,那我们定义的接口MyPredicate方法filterStudent(),好像没什么作用呀。然而官方已经想到这一点,它内置了一些通用接口,我们可以使用它。例如断言的接口 Predicate,那我们就用如下方式,完全不用写接口MyPredicate方法filterStudent(),如下:

// 按myPredicate策略过滤出满足条件的学生

private static List filterStudent(List students,

Predicate predicate) {

List stus = new ArrayList<>();

for (Student stu : students) {

if (predicate.test(stu)) {

stus.add(stu);

}

}

return stus;

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了

面试真题

Spring源码笔记

YW-1711860959541)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-0c7yUMuP-1711860959541)]

总结

在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了

[外链图片转存中…(img-l400iKOr-1711860959542)]

[外链图片转存中…(img-5d1UV5Pb-1711860959543)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值