Java 函数式编程实践:使用 Lambda 表达式实现集合筛选和转换。
Java 8 引入了函数式编程(Functional Programming)的特性,其中包含 Lambda 表达式,使得 Java 开发者可以更容易地使用函数式编程思想来编写程序。
在函数式编程中,函数被视为一等公民,也就是说,函数和其他数据类型一样,都可以作为参数传递给另一个函数,或者从一个函数中返回。使用 Lambda 表达式,可以方便地创建匿名函数或闭包,从而实现更简单、更灵活的编程方式。
集合筛选和转换是 Java 语言中常见的操作之一,这些操作通常需要编写一些复杂的代码,包括 for 循环、if 判断等。使用 Lambda 表达式,可以大大简化这些操作,使得代码更易于编写和维护。
下面,我们将通过一个实例来介绍如何使用 Lambda 表达式实现集合筛选和转换。
首先,我们定义一个学生类,其中包含学生姓名、性别和成绩。
public class Student {
private String name;
private String sex;
private int score;
public Student(String name, String sex, int score) {
this.name = name;
this.sex = sex;
this.score = score;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public int getScore() {
return score;
}
}
接下来,我们创建一个学生列表,并向其中添加一些学生信息。
List<Student> students = new ArrayList<>();
students.add(new Student("Alice", "female", 85));
students.add(new Student("Bob", "male", 70));
students.add(new Student("Cathy", "female", 90));
students.add(new Student("David", "male", 80));
现在,我们需要从学生列表中筛选出所有女生,并将其姓名和成绩转换为一个字符串数组。使用传统的方式,我们需要编写如下代码:
List<String> femaleStudents = new ArrayList<>();
for (Student student : students) {
if (student.getSex().equals("female")) {
femaleStudents.add(student.getName() + ": " + student.getScore());
}
}
String[] femaleNamesAndScores = femaleStudents.toArray(new String[0]);
使用 Lambda 表达式,可以将上述代码简化为如下形式:
String[] femaleNamesAndScores = students.stream()
.filter(s -> s.getSex().equals("female"))
.map(s -> s.getName() + ": " + s.getScore())
.toArray(String[]::new);
我们可以看到,上述代码使用了 Stream 流的方式来对集合进行操作。具体来说,
- 使用 students.stream() 将学生列表转换为 Stream 流;
- 使用 .filter(s -> s.getSex().equals("female")) 过滤出所有性别为女的学生;
- 使用 .map(s -> s.getName() + ": " + s.getScore()) 将每个学生的姓名和成绩转换为一个字符串;
- 使用 .toArray(String[]::new) 将转换后的字符串数组存储起来。
需要注意的是,Lambda 表达式中的 s -> s.getXXX() 可以使用方法引用的方式来代替,例如:.map(Student::getName)。
除了集合筛选和转换外,Lambda 表达式还可以用于排序、分组、归约等操作。使用 Lambda 表达式,可以使得 Java 代码更具可读性和可维护性,提高开发效率。
