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