当前位置:实例文章 » 其他实例» [文章]Java8 stream toMap、groupingBy、mapping的综合应用

Java8 stream toMap、groupingBy、mapping的综合应用

发布人:shili8 发布时间:2025-02-08 14:54 阅读次数:0

**Java8 流式编程中的 `toMap`、`groupingBy` 和 `mapping` 综合应用**

在 Java8 中,流式编程提供了一种高效的方式来处理数据集合。其中,`toMap`、`groupingBy` 和 `mapping` 三个方法是流式编程中非常有用的工具。它们可以帮助我们将数据转换为映射(map)、分组和映射等形式,从而实现更复杂的数据处理。

在本文中,我们将通过实例代码示例来展示这些方法的综合应用,包括 `toMap`、`groupingBy` 和 `mapping` 的使用,以及它们如何帮助我们解决实际问题。

###1. `toMap` 方法`toMap` 方法用于将流中的元素转换为一个映射(map)。它接受两个参数:一个函数来提取键值,另一个函数来提取值。这个方法非常有用,当我们需要将数据集合转换为一个映射时。

javaimport java.util.stream.Stream;

public class ToMapExample {
 public static void main(String[] args) {
 Stream stream = Stream.of("John", "Mary", "David");
 // 使用 toMap 将流中的元素转换为一个映射 java.util.Map map = stream.map(s -> s.length())
 .collect(java.util.stream.Collectors.toMap(
 k -> "length",
 v -> (int) k));
 System.out.println(map);
 }
}


在这个例子中,我们使用 `toMap` 将流中的元素转换为一个映射,其中键值是每个字符串的长度,值也是每个字符串的长度。

###2. `groupingBy` 方法`groupingBy` 方法用于将流中的元素分组。它接受一个函数来提取分组键,然后返回一个分组后的流。这个方法非常有用,当我们需要将数据集合根据某种属性进行分类时。

javaimport java.util.stream.Stream;

public class GroupingByExample {
 public static void main(String[] args) {
 Stream stream = Stream.of("John", "Mary", "David");
 // 使用 groupingBy 将流中的元素分组 java.util.Map map = stream.collect(
 java.util.stream.Collectors.groupingBy(
 s -> s.charAt(0),
 java.util.stream.Collectors.counting()));
 System.out.println(map);
 }
}


在这个例子中,我们使用 `groupingBy` 将流中的元素分组,根据每个字符串的首字母进行分类,然后统计每个分组中的元素数量。

###3. `mapping` 方法`mapping` 方法用于将流中的元素转换为另一种类型。它接受一个函数来进行转换,然后返回一个新的流。这个方法非常有用,当我们需要将数据集合转换为另一种形式时。

javaimport java.util.stream.Stream;

public class MappingExample {
 public static void main(String[] args) {
 Stream stream = Stream.of("John", "Mary", "David");
 // 使用 mapping 将流中的元素转换为另一种类型 Stream newStream = stream.map(s -> s.length());
 System.out.println(newStream);
 }
}


在这个例子中,我们使用 `mapping` 将流中的元素转换为每个字符串的长度。

### 综合应用现在,让我们综合上述方法来解决一个实际问题。假设我们有一个学生信息集合,包含学生姓名、年龄和成绩。我们需要将这些数据转换为以下形式:

* 每个学生的平均成绩* 每个学生的最高分* 每个学生的最低分
javaimport java.util.stream.Stream;

public class ComprehensiveExample {
 public static void main(String[] args) {
 Stream stream = Stream.of(
 new Student("John",18,90),
 new Student("Mary",19,85),
 new Student("David",20,95)
 );
 // 使用 toMap 将流中的元素转换为一个映射 java.util.Map averageScoreMap = stream.collect(
 java.util.stream.Collectors.toMap(
 s -> s.getName(),
 s -> (double) s.getScore() /3));
 System.out.println("平均成绩:" + averageScoreMap);
 // 使用 groupingBy 将流中的元素分组 java.util.Map highestScoreMap = stream.collect(
 java.util.stream.Collectors.groupingBy(
 Student::getName,
 java.util.stream.Collectors.maxBy(
 (s1, s2) -> s1.getScore() - s2.getScore())));
 System.out.println("最高分:" + highestScoreMap);
 // 使用 mapping 将流中的元素转换为另一种类型 Stream newStream = stream.map(s -> {
 Student student = new Student();
 student.setName(s.getName());
 student.setAge(s.getAge());
 student.setScore(Math.max(s.getScore(), Math.min(s.getScore(),100)));
 return student;
 });
 System.out.println("最低分:" + newStream);
 }
}

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

 public Student() {}

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

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public int getAge() {
 return age;
 }

 public void setAge(int age) {
 this.age = age;
 }

 public int getScore() {
 return score;
 }

 public void setScore(int score) {
 this.score = score;
 }
}


在这个例子中,我们综合使用 `toMap`、`groupingBy` 和 `mapping` 方法来解决一个实际问题。我们首先使用 `toMap` 将流中的元素转换为一个映射,每个学生的平均成绩作为键值,平均分数作为值。然后,我们使用 `groupingBy` 将流中的元素分组,每个学生的最高分作为分组键,最高分作为值。最后,我们使用 `mapping` 将流中的元素转换为另一种类型,每个学生的最低分作为新流中的元素。

通过综合使用这些方法,我们可以解决更加复杂的问题,并且能够更高效地处理数据集合。

相关标签:pythonwindows开发语言
其他信息

其他资源

Top