Java进阶(五十五)-Java Lambda表达式入门_eclipse lambda(2)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

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

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

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

// 1.1使用匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(“Hello world !”);
}
}).start();

// 1.2使用 lambda expression
new Thread(() -> System.out.println(“Hello world !”)).start();

// 2.1使用匿名内部类
Runnable race1 = new Runnable() {
@Override
public void run() {
System.out.println(“Hello world !”);
}
};

// 2.2使用 lambda expression
Runnable race2 = () -> System.out.println(“Hello world !”);

// 直接调用 run 方法(没开新线程哦!)
race1.run();
race2.run();

Runnable 的 lambda表达式,使用块格式,将五行代码转换成单行语句。 接下来,在下一节中我们将使用lambdas对集合进行排序。

使用Lambdas排序集合

在Java中,Comparator 类被用来排序集合。 在下面的例子中,我们将根据球员的 name, surname, name 长度 以及最后一个字母。 和前面的示例一样,先使用匿名内部类来排序,然后再使用lambda表达式精简我们的代码。
在第一个例子中,我们将根据name来排序list。 使用旧的方式,代码如下所示:

String[] players = {“Rafael Nadal”, “Novak Djokovic”,
“Stanislas Wawrinka”, “David Ferrer”,
“Roger Federer”, “Andy Murray”,
“Tomas Berdych”, “Juan Martin Del Potro”,
“Richard Gasquet”, “John Isner”};

// 1.1 使用匿名内部类根据 name 排序 players
Arrays.sort(players, new Comparator() {
@Override
public int compare(String s1, String s2) {
return (s1.compareTo(s2));
}
});

使用lambdas,可以通过下面的代码实现同样的功能:

// 1.2 使用 lambda expression 排序 players
Comparator sortByName = (String s1, String s2) -> (s1.compareTo(s2));
Arrays.sort(players, sortByName);

// 1.3 也可以采用如下形式:
Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));

其他的排序如下所示。 和上面的示例一样,代码分别通过匿名内部类和一些lambda表达式来实现Comparator :

// 1.1 使用匿名内部类根据 surname 排序 players
Arrays.sort(players, new Comparator() {
@Override
public int compare(String s1, String s2) {
return (s1.substring(s1.indexOf(" “)).compareTo(s2.substring(s2.indexOf(” "))));
}
});

// 1.2 使用 lambda expression 排序,根据 surname
Comparator sortBySurname = (String s1, String s2) ->
( s1.substring(s1.indexOf(" “)).compareTo( s2.substring(s2.indexOf(” ")) ) );
Arrays.sort(players, sortBySurname);

// 1.3 或者这样,怀疑原作者是不是想错了,括号好多…
Arrays.sort(players, (String s1, String s2) ->
( s1.substring(s1.indexOf(" “)).compareTo( s2.substring(s2.indexOf(” ")) ) )
);

// 2.1 使用匿名内部类根据 name lenght 排序 players
Arrays.sort(players, new Comparator() {
@Override
public int compare(String s1, String s2) {
return (s1.length() - s2.length());
}
});

// 2.2 使用 lambda expression 排序,根据 name lenght
Comparator sortByNameLenght = (String s1, String s2) -> (s1.length() - s2.length());
Arrays.sort(players, sortByNameLenght);

// 2.3 or this
Arrays.sort(players, (String s1, String s2) -> (s1.length() - s2.length()));

// 3.1 使用匿名内部类排序 players, 根据最后一个字母
Arrays.sort(players, new Comparator() {
@Override
public int compare(String s1, String s2) {
return (s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1));
}
});

// 3.2 使用 lambda expression 排序,根据最后一个字母
Comparator sortByLastLetter =
(String s1, String s2) ->
(s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1));
Arrays.sort(players, sortByLastLetter);

// 3.3 or this
Arrays.sort(players, (String s1, String s2) -> (s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1)));

就是这样,简洁又直观。 在下一节中我们将探索更多lambdas的能力,并将其与 stream 结合起来使用。

使用Lambdas和Streams

Stream是对集合的包装,通常和lambda一起使用。 使用lambdas可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。同样,Stream使用懒运算,他们并不会真正地读取所有数据,遇到像getFirst() 这样的方法就会结束链式语法。在接下来的例子中,我们将探索lambdas和streams 能做什么。我们创建了一个Person类并使用这个类来添加一些数据到list中,将用于进一步流操作。 Person 只是一个简单的POJO类:

public class Person {

private String firstName, lastName, job, gender;
private int salary, age;

public Person(String firstName, String lastName, String job,
String gender, int age, int salary) {
this.firstName = firstName;
this.lastName = lastName;
this.gender = gender;
this.age = age;
this.job = job;
this.salary = salary;
}
// Getter and Setter
// . . . . .
}

接下来,我们将创建两个list,都用来存放Person对象:

List javaProgrammers = new ArrayList() {
{
add(new Person(“Elsdon”, “Jaycob”, “Java programmer”, “male”, 43, 2000));
add(new Person(“Tamsen”, “Brittany”, “Java programmer”, “female”, 23, 1500));
add(new Person(“Floyd”, “Donny”, “Java programmer”, “male”, 33, 1800));
add(new Person(“Sindy”, “Jonie”, “Java programmer”, “female”, 32, 1600));
add(new Person(“Vere”, “Hervey”, “Java programmer”, “male”, 22, 1200));
add(new Person(“Maude”, “Jaimie”, “Java programmer”, “female”, 27, 1900));
add(new Person(“Shawn”, “Randall”, “Java programmer”, “male”, 30, 2300));
add(new Person(“Jayden”, “Corrina”, “Java programmer”, “female”, 35, 1700));
add(new Person(“Palmer”, “Dene”, “Java programmer”, “male”, 33, 2000));
add(new Person(“Addison”, “Pam”, “Java programmer”, “female”, 34, 1300));
}
};

List phpProgrammers = new ArrayList() {
{
add(new Person(“Jarrod”, “Pace”, “PHP programmer”, “male”, 34, 1550));
add(new Person(“Clarette”, “Cicely”, “PHP programmer”, “female”, 23, 1200));
add(new Person(“Victor”, “Channing”, “PHP programmer”, “male”, 32, 1600));
add(new Person(“Tori”, “Sheryl”, “PHP programmer”, “female”, 21, 1000));
add(new Person(“Osborne”, “Shad”, “PHP programmer”, “male”, 32, 1100));
add(new Person(“Rosalind”, “Layla”, “PHP programmer”, “female”, 25, 1300));
add(new Person(“Fraser”, “Hewie”, “PHP programmer”, “male”, 36, 1100));
add(new Person(“Quinn”, “Tamara”, “PHP programmer”, “female”, 21, 1000));
add(new Person(“Alvin”, “Lance”, “PHP programmer”, “male”, 38, 1600));
add(new Person(“Evonne”, “Shari”, “PHP programmer”, “female”, 40, 1800));
}
};

现在我们使用forEach方法来迭代输出上述列表:

System.out.println(“所有程序员的姓名:”);
javaProgrammers.forEach(§ -> System.out.printf("%s %s; “, p.getFirstName(), p.getLastName()));
phpProgrammers.forEach(§ -> System.out.printf(”%s %s; ", p.getFirstName(), p.getLastName()));

我们同样使用forEach方法,增加程序员的工资5%:

System.out.println(“给程序员加薪 5% :”);
Consumer giveRaise = e -> e.setSalary(e.getSalary() / 100 * 5 + e.getSalary());

javaProgrammers.forEach(giveRaise);
phpProgrammers.forEach(giveRaise);

另一个有用的方法是过滤器filter() ,让我们显示月薪超过1400美元的PHP程序员:

System.out.println(“下面是月薪超过 $1,400 的PHP程序员:”)
phpProgrammers.stream()
.filter(§ -> (p.getSalary() > 1400))
.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

我们也可以定义过滤器,然后重用它们来执行其他操作:

// 定义 filters
Predicate ageFilter = § -> (p.getAge() > 25);
Predicate salaryFilter = § -> (p.getSalary() > 1400);
Predicate genderFilter = § -> (“female”.equals(p.getGender()));

System.out.println(“下面是年龄大于 24岁且月薪在$1,400以上的女PHP程序员:”);
phpProgrammers.stream()
.filter(ageFilter)
.filter(salaryFilter)
.filter(genderFilter)
.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

// 重用filters
System.out.println(“年龄大于 24岁的女性 Java programmers:”);
javaProgrammers.stream()
.filter(ageFilter)
.filter(genderFilter)
.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

使用limit方法,可以限制结果集的个数:

System.out.println(“最前面的3个 Java programmers:”);
javaProgrammers.stream()
.limit(3)
.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

System.out.println(“最前面的3个女性 Java programmers:”);
javaProgrammers.stream()
.filter(genderFilter)
.limit(3)
.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

排序呢? 我们在stream中能处理吗? 答案是肯定的。 在下面的例子中,我们将根据名字和薪水排序Java程序员,放到一个list中,然后显示列表:

System.out.println(“根据 name 排序,并显示前5个 Java programmers:”);
List sortedJavaProgrammers = javaProgrammers
.stream()
.sorted((p, p2) -> (p.getFirstName().compareTo(p2.getFirstName())))
.limit(5)
.collect(toList());

sortedJavaProgrammers.forEach(§ -> System.out.printf(“%s %s; %n”, p.getFirstName(), p.getLastName()));

System.out.println(“根据 salary 排序 Java programmers:”);
sortedJavaProgrammers = javaProgrammers
.stream()
.sorted( (p, p2) -> (p.getSalary() - p2.getSalary()) )
.collect( toList() );

sortedJavaProgrammers.forEach(§ -> System.out.printf(“%s %s; %n”, p.getFirstName(), p.getLastName()));

如果我们只对最低和最高的薪水感兴趣,比排序后选择第一个/最后一个 更快的是min和max方法:

学习分享,共勉

题外话,毕竟我工作多年,深知技术改革和创新的方向,Flutter作为跨平台开发技术、Flutter以其美观、快速、高效、开放等优势迅速俘获人心

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

开发技术、Flutter以其美观、快速、高效、开放等优势迅速俘获人心

[外链图片转存中…(img-bjjAtDil-1713691195478)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-xu9aRbur-1713691195479)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值