在开发过程中会经常遇到把一个List集合中的对象按照某个属性进行分组,然后把分组后的结果再另外处理的这种情况。分组的时候如果是比较简单的只需要分一次组,复杂情况时需要进行二次分组,甚至三次分组。我们可以使用Collectors.groupingBy 来提高工作效率。具体分组请看下面代码。
先创建一个Bean对象。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private String name;
private Integer age;
private Date birthday;
private Double ff;
}
普通的分组方式,可以通过Map的key是唯一的这种特性进行分组。
public static void main(String[] args) throws CloneNotSupportedException {
// 需求根据name进行分组,key是name, value是List<Student>的集合
// 数据初始化
List<Student> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Student student;
if (i <2) {
student = new Student("name", i, new Date(), 11.0);
} else {
student = new Student("name2", i, new Date(), 11.0);
}文章来源:https://www.toymoban.com/news/detail-441913.htmllist.add(student);
}
// 分组方式1
Map<String, List<Student>> map = new HashMap<>();
for (Student student : list) {
if (map.get(student.getName()) == null) {
List<Student> studentList = new ArrayList<>();
studentList.add(student);
map.put(student.getName(), studentList);
} else {
map.get(student.getName()).add(student);
}
}
}
使用collections.groupby来简化代码量
public static void main(String[] args) throws CloneNotSupportedException {
// 需求根据name进行分组,key是name, value是List<Student>的集合
// 数据初始化
List<Student> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Student student;
if (i <2) {
student = new Student("name", i, new Date(), 11.0);
} else {
student = new Student("name2", i, new Date(), 11.0);
}list.add(student);
}
// 这句分组与分组方式1的效果相同,但是代码量就少了很多,建议用下面的写法,需要java8以上。
// 分组方式2
Map<String, List<Student>> collect = list.stream().collect(Collectors.groupingBy(Student::getName));
// 组内再分组,总共是2次分组,适用于先进行第一次分组,然后在第一次分组的基础上再进行一次分组的情况; key: name ,value: Map<ff, List<Student>
// 先按name进行第一次分组,然后再按ff进行第二次分组;
Map<String, Map<Double, List<Student>>> collect1 = list.stream().collect(Collectors.groupingBy(Student::getName, Collectors.groupingBy(Student::getFf)));
System.out.println(collect1);
Set<Map.Entry<String, Map<Double, List<Student>>>> entries = collect1.entrySet();
for (Map.Entry<String, Map<Double, List<Student>>> entry : entries) {
Map<Double, List<Student>> ffMap = entry.getValue();
Set<Map.Entry<Double, List<Student>>> entries1 = ffMap.entrySet();
for (Map.Entry<Double, List<Student>> doubleListEntry : entries1) {
// 这时候的studentList 出来的 name和ff都是同一组的。
List<Student> studentList = doubleListEntry.getValue();
}
}
}文章来源地址https://www.toymoban.com/news/detail-441913.html
到了这里,关于List集合进行分组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!