【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!
博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!
吾等采石之人,应怀大教堂之心,愿我们奔赴在各自的热爱里…
语法入门
Java8引入了lambda表达式,是一种匿名函数,允许在方法中传递代码块,类似于匿名内部类,但lambda表达式更为简洁和可读。Java8中使用lambda表达式可以将函数式编程风格引入Java程序中,简化代码,提高代码的可读性和可维护性。
一个简单的lambda表达式由三部分组成:
-
参数列表:参数列表是放在一对圆括号中的,如果有多个参数,用逗号隔开。例如:
(int x, int y)
-
箭头符号:箭头符号是一个横杠后跟大于号(->),用于将参数列表与lambda表达式主体分开。例如:
->
-
主体:主体是放在一对花括号中的代码块,它执行lambda表达式的操作,并返回结果。例如:
(x, y) -> x + y
lambda表达式的语法如下:
(parameters) -> expression
或者
(parameters) -> { statements; }
其中,parameters是传递给lambda表达式的参数列表,可以是空参数或非空参数。如果有多个参数,则用逗号分隔。expression是一个表达式,代表lambda表达式执行的操作。如果主体是多条语句,则必须用花括号({})将它们括起来,并且用分号(;)分隔每一条语句。
以下是一个简单的lambda表达式实例:
public class LambdaDemo {
public static void main(String[] args) {
// lambda表达式实现Runnable接口
Runnable r = () -> System.out.println("Hello, World!");
// 启动线程
new Thread(r).start();
}
}
输出
Hello, World!
这个例子中,我们使用lambda表达式实现了Runnable接口,将代码块传递给Thread构造函数,从而创建一个新的线程并启动。
案例学习
以下是一个简单的lambda表达式示例,用于对一个列表进行排序:
List<Integer> list = Arrays.asList(5, 3, 1, 4, 2);
// 进行升序排序
Collections.sort(list, (a, b) -> a.compareTo(b));
// 输出排序结果
System.out.println(list);
输出结果为
[1, 2, 3, 4, 5]
在这个例子中,我们使用lambda表达式作为参数传递给Collections.sort()方法,对列表进行升序排序。lambda表达式中使用了compareTo()方法来比较两个元素的大小,这是因为List的元素类型是Integer,而Integer类实现了Comparable接口。在这个例子中,lambda表达式的参数类型是两个Integer类型的元素a和b,箭头后面的主体是一个表达式a.compareTo(b)。由于compareTo()方法返回一个整数值,所以不需要在主体中使用return语句。
除了对列表进行排序,lambda表达式还可以用于处理集合元素,例如在一个列表中查找满足条件的元素:
List<String> list = Arrays.asList("apple", "banana", "orange", "pear");
// 使用lambda表达式查找第一个长度大于3的字符串
String result = list.stream()
.filter(str -> str.length() > 3)
.findFirst()
.orElse(null);
// 输出结果
System.out.println(result);
输出结果为
apple
在这个例子中,我们使用了Java 8新增的Stream API和lambda表达式,对列表中的元素进行过滤和查找操作。首先,list调用了stream()方法,将列表转换成一个流,然后使用filter()方法过滤出长度大于3的字符串,最后使用findFirst()方法查找第一个满足条件的元素,并调用orElse()方法获取查找结果。lambda表达式的参数类型是字符串类型的元素str,主体是一个表达式str.length() > 3,表示判断字符串的长度是否大于3。由于filter()方法返回一个Stream对象,findFirst()方法返回一个Optional对象,所以最后需要使用orElse()方法获取查找结果。
以下是一个具体的案例,使用lambda表达式对一个学生列表进行排序:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class LambdaDemo {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("Tom", 80));
students.add(new Student("Jerry", 90));
students.add(new Student("Mike", 75));
students.add(new Student("Bob", 85));
// 传统方式,通过实现Comparator接口对学生列表进行按成绩排序
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getScore() - o2.getScore();
}
});
for (Student s : students) {
System.out.println(s.getName() + " " + s.getScore());
}
System.out.println("-------------------------");
// 使用lambda表达式对学生列表进行按成绩排序
Collections.sort(students, (Student o1, Student o2) -> o1.getScore() - o2.getScore());
for (Student s : students) {
System.out.println(s.getName() + " " + s.getScore());
}
}
}
class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
}
上述代码的输出结果为:
Mike 75
Tom 80
Bob 85
Jerry 90
-------------------------
Mike 75
Tom 80
Bob 85
Jerry 90
输出结果中,可以看到,学生列表按成绩从小到大排序,然后输出学生的姓名和成绩。使用传统方式和使用lambda表达式得到的结果是一致的。
这个例子中,我们定义了一个Student类表示学生,包含姓名和成绩两个属性。我们使用Collections.sort()方法对学生列表进行排序。首先,我们传统方式通过实现Comparator接口对学生列表进行按成绩排序。然后,使用lambda表达式对学生列表进行按成绩排序,可以看到,使用lambda表达式可以使代码更简洁,更易读,提高代码的可维护性。
📖☕️🌊📝📚🎩🚀
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!
📚愿我们奔赴在各自的热爱里!