📫 作者简介:「子非我鱼」,专注于研究全栈
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~
引言
在Java中,集合分组是一种常见的操作,它允许我们按照特定的条件或属性对集合元素进行分类。这种分组操作通常涉及到使用Map、Stream等工具。本文将介绍在Java中如何使用不同的方式对集合进行分组。
1,使用Map进行基本分组
假设我们有一个包含学生对象的集合,我们想按照学生的年级进行分组。可以使用Java 8的Stream API和Collectors.groupingBy实现:
List<Student> students = Arrays.asList(
new Student("Alice", "A", 1),
new Student("Bob", "B", 2),
new Student("Charlie", "A", 1),
new Student("David", "B", 2),
new Student("Emma", "C", 3)
);
Map<Integer, List<Student>> studentsByGrade = students.stream()
.collect(Collectors.groupingBy(Student::getGrade));
System.out.println(studentsByGrade);
以上代码将按照学生的年级(grade)进行分组,输出结果为:
{1=[Student{name='Alice', grade='A', gradeNumber=1}, Student{name='Charlie', grade='A', gradeNumber=1}],
2=[Student{name='Bob', grade='B', gradeNumber=2}, Student{name='David', grade='B', gradeNumber=2}],
3=[Student{name='Emma', grade='C', gradeNumber=3}]}
2,使用多级分组
在有些情况下,我们可能需要多级分组。例如,按照年级和班级进行分组:
Map<String, Map<Integer, List<Student>>> studentsByGradeAndClass = students.stream()
.collect(Collectors.groupingBy(Student::getGrade,
Collectors.groupingBy(Student::getGradeNumber)));
System.out.println(studentsByGradeAndClass);
输出结果为:
{A={1=[Student{name='Alice', grade='A', gradeNumber=1}, Student{name='Charlie', grade='A', gradeNumber=1}]},
B={2=[Student{name='Bob', grade='B', gradeNumber=2}, Student{name='David', grade='B', gradeNumber=2}]},
C={3=[Student{name='Emma', grade='C', gradeNumber=3}]}}
3,使用stream进行返祖
1,准备数据
UserInfo.java
@Data
@AllArgsConstructor
public class UserInfo {
private Long id;
private String username;
private String password;
}
ArrayList<UserInfo> userInfos = new ArrayList<>();
UserInfo user1 = new UserInfo(1L, "子", "123");
UserInfo user2 = new UserInfo(2L, "非", "345");
UserInfo user3 = new UserInfo(4L, "我", "567");
UserInfo user4 = new UserInfo(4L, "我", "567");
userInfos.add(user1);
userInfos.add(user2);
userInfos.add(user3);
userInfos.add(user4);
2,编写java代码实现分组
// 单个属性分组,根据id分组
Map<Long, List<UserInfo>> collect = userInfos.stream().collect(Collectors.groupingBy(UserInfo::getId));
System.out.println(collect);
// 多个属性分组
Map<String, List<UserInfo>> collect1 = userInfos.stream().collect(Collectors.groupingBy(d -> fetchGroupKey(d)));
System.out.println(collect1);
fetchGroupKey方法
public static String fetchGroupKey(UserInfo userInfo){
return userInfo.getId().toString()+userInfo.getUsername()+userInfo.getPassword();
}
通过这些例子,您可以看到Java集合分组的灵活性和强大性。根据实际情况选择合适的分组方式,可以轻松管理和处理各种数据结构。