Java通过Stream遍历对字段求和

引言

在Java的程序开发中,经常会遇到对集合或数组中的元素进行求和的需求。传统的方法是通过循环遍历所有元素,并将其相加。然而,随着Java 8引入的Stream API,我们可以更加简洁高效地实现这一功能。本文将介绍如何使用Java的Stream API遍历集合,并对字段进行求和操作。

Stream简介

在Java 8之前,我们需要通过迭代器或循环来遍历集合中的元素。而Stream API则提供了一种更加优雅的方式来处理集合数据。Stream可以看作是对集合进行一系列操作的元素序列,这些操作包括过滤、映射、排序、归约等。使用Stream API可以将这些操作串联起来,并在一次遍历中完成。

Java的Stream API以流的形式处理集合中的元素,可以从集合、数组、I/O通道等数据源创建。对于集合而言,可以通过调用集合的stream()方法获得一个Stream对象,然后可以对该Stream对象进行各种操作。下面是创建Stream对象的示例代码:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = numbers.stream();

Stream遍历求和

假设我们有一个存储学生考试成绩的集合,每个学生对象包含姓名和成绩两个字段。我们希望对集合中的成绩进行求和操作。下面是一个学生类的示例代码:

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

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

    // 省略getter和setter方法
}

现在,我们将使用Stream API来遍历学生集合,并对成绩字段进行求和。首先,我们可以创建一个包含学生对象的List集合:

List<Student> students = Arrays.asList(
        new Student("张三", 85),
        new Student("李四", 90),
        new Student("王五", 80),
        new Student("赵六", 95)
);

接下来,我们可以使用Stream的mapToInt()方法来将学生对象中的成绩字段映射为一个IntStream对象,然后使用sum()方法对成绩进行求和。下面是完整的求和代码:

int sum = students.stream()
        .mapToInt(Student::getScore)
        .sum();

上述代码中,首先通过调用stream()方法将集合转换为Stream对象。然后,使用mapToInt()方法将Stream中的学生对象映射为IntStream对象,通过方法引用Student::getScore可以获取每个学生对象的成绩字段。最后,使用sum()方法对所有成绩进行求和。

类图

下面是学生类的类图:

classDiagram
    class Student {
        - String name
        - int score
        + Student(name: String, score: int)
        + getName(): String
        + setName(name: String): void
        + getScore(): int
        + setScore(score: int): void
    }

Stream遍历其他操作

除了求和操作,Stream API还提供了许多其他有用的操作方法。下面是一些常用的Stream操作示例:

过滤

通过filter()方法可以对Stream中的元素进行过滤,只保留满足条件的元素。比如,我们可以过滤出成绩大于等于90分的学生:

List<Student> topStudents = students.stream()
        .filter(student -> student.getScore() >= 90)
        .collect(Collectors.toList());

映射

使用map()方法可以将Stream中的元素映射为另一种类型。比如,我们可以将学生对象映射为姓名列表:

List<String> names = students.stream()
        .map(Student::getName)
        .collect(Collectors.toList());

排序

通过sorted()方法可以对Stream中的元素进行排序。比如,我们可以按照成绩从高到低对学生进行排序:

List<Student> sortedStudents = students.stream()
        .sorted