欢迎访问宙启技术站
智能推送

Java 函数式编程实践:使用 Lambda 表达式实现集合筛选和转换。

发布时间:2023-05-27 15:30:14

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 代码更具可读性和可维护性,提高开发效率。