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) { Streamstream = 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) { Streamstream = 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) { Streamstream = 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) { Streamstream = 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` 将流中的元素转换为另一种类型,每个学生的最低分作为新流中的元素。
通过综合使用这些方法,我们可以解决更加复杂的问题,并且能够更高效地处理数据集合。