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

Java函数式编程:StreamAPI实现数据流的操作

发布时间:2023-06-17 05:46:35

StreamAPI是Java8中新增的功能,它提供了一种流式操作数据的方式。在传统的Java编程中,我们通常需要创建一个集合,然后使用循环对集合中的元素进行遍历和操作,这种方式有时候会比较繁琐和低效。而StreamAPI则可以很好地解决这些问题。

StreamAPI的特点:

1. 声明式:我们只需要关注对数据的描述,而不需要关注具体的实现过程,这种方式更加容易理解和维护。

2. 可以并行化:StreamAPI可以将数据分为多个子集,进行并行处理,从而提高处理效率。

3. 不会改变数据源:StreamAPI的操作不会对原始数据进行修改,而是返回一组新的数据,这样就不会对原始数据造成任何影响。

StreamAPI的操作分为中间操作和终止操作。中间操作的返回值是一个Stream对象,可以继续对其进行操作;而终止操作则是处理整个流并返回结果的操作,返回值可以是任何类型。

常用的中间操作如下:

1. filter:过滤符合条件的元素,返回一个新流。

2. map:对每个元素进行处理,如将字符串转成大写,返回一个新流。

3. flatMap:与map类似,但是返回的是一个由多个流合并成的流。

4. distinct:去除重复元素,返回一个新流。

5. sorted:对流进行排序,返回一个新流。

6. peek:在处理元素时,会先进行peek操作,然后再进行下一步的操作。

7. limit:返回前n个元素组成的流。

8. skip:跳过前n个元素,返回剩余元素组成的流。

常用的终止操作如下:

1. forEach:对每个元素进行操作。

2. reduce:将流中的元素转换成一个新值,如求和、求最大值。

3. collect:将流中的元素转换成一个集合,如List、Set、Map等。

4. min/max:返回流中的最小值或最大值。

5. count:返回流中元素的个数。

6. anyMatch/allMatch/noneMatch:返回流中是否存在满足条件的元素。

7. findFirst/findAny:返回流中第一个或任意一个元素。

下面以一个例子来演示StreamAPI的用法,假设我们需要对一个学生列表进行一些操作,这个列表可能有重复的元素:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("张三", 20));
        students.add(new Student("李四", 22));
        students.add(new Student("王五", 21));
        students.add(new Student("张三", 20));
        students.add(new Student("赵六", 20));

        // 过滤掉年龄小于21岁的学生,并将结果集合转化为List
        List<String> names = students.stream()
                .filter(s -> s.getAge() >= 21)
                .distinct()
                .sorted((s1, s2) -> s1.getName().compareTo(s2.getName()))
                .map(Student::getName)
                .collect(Collectors.toList());
        System.out.println(names);
    }
}

运行结果为:

[李四, 王五]

以上代码中,我们通过使用StreamAPI,选择了年龄大于等于21岁的学生,并去重,然后按照姓名进行排序,并将结果转换成一个List。可以看到,使用StreamAPI可以很方便地对数据流进行处理,从而提高代码的可读性和效率。