Java 按属性分离列表

Java 按属性分离列表,java,java-8,java-stream,Java,Java 8,Java Stream,我们有一份属于不同年级的学生名单——List 在处理清单时,必须将其分为不同的等级。 该方法的最终输出将是一个等级列表,等级如下: Grade{ String grade; List<Student> students; } 等级{ 串级; 列出学生名单; } 当前的方法是通过迭代学生来构建中间图map。 然后,通过从地图创建坡度实例,将中间地图转换为列表。 考虑到学生人数将达到数千,有没有更好的方法——减少迭代次数 返回类型不是一个选项,我们使用的是Java 8

我们有一份属于不同年级的学生名单——
List

在处理清单时,必须将其分为不同的等级。 该方法的最终输出将是一个等级列表,等级如下:

Grade{
    String grade;
    List<Student> students;
}
等级{
串级;
列出学生名单;
}
当前的方法是通过迭代学生来构建中间图
map
。 然后,通过从地图创建坡度实例,将中间地图转换为列表。
考虑到学生人数将达到数千,有没有更好的方法——减少迭代次数


返回类型不是一个选项,我们使用的是Java 8。

假设构造函数如下:

public Grade(String grade, List<Student> students){}

假设这样的构造函数:

public Grade(String grade, List<Student> students){}

我觉得这相当简单:

Map<String, List<Student>> collect = sList.stream()
                                    .collect(Collectors.groupingBy(Student::getGrade));
Map collect=sList.stream()
.collect(收集器.groupingBy(学生::getGrade));
在上述步骤之后,您有了
Map
,并且根据您的问题,您希望进一步将
Map
转换为
List
,理想情况下,它应该具有如下构造函数:

  public Grade(String grade, List<Student> students) {
    this.grade = grade;
    this.students = students;
  }
公共等级(字符串等级,列出学生){
这个。等级=等级;
这个。学生=学生;
}
现在,将
映射
转换为
列表

List gList=collect.entrySet()
.stream()
.map(m->新等级(m.getKey(),m.getValue())
.collect(Collectors.toList());

我觉得这很简单:

Map<String, List<Student>> collect = sList.stream()
                                    .collect(Collectors.groupingBy(Student::getGrade));
Map collect=sList.stream()
.collect(收集器.groupingBy(学生::getGrade));
在上述步骤之后,您有了
Map
,并且根据您的问题,您希望进一步将
Map
转换为
List
,理想情况下,它应该具有如下构造函数:

  public Grade(String grade, List<Student> students) {
    this.grade = grade;
    this.students = students;
  }
公共等级(字符串等级,列出学生){
这个。等级=等级;
这个。学生=学生;
}
现在,将
映射
转换为
列表

List gList=collect.entrySet()
.stream()
.map(m->新等级(m.getKey(),m.getValue())
.collect(Collectors.toList());
我认为使用带有合并功能的
toMap()
收集器更好

List<Grade> grades = new ArrayList<>(list.stream()
            .collect(Collectors
           .toMap(Student::getGrade, YOUR_CLASS::value, YOUR_CLASS::merge)).values()); 
List grades=newarraylist(List.stream()
.收藏(收藏家)
.toMap(Student::getGrade,YOUR_CLASS::value,YOUR_CLASS::merge)).values();

private静态成绩值(学生){
返回新的等级(s.getGrade(),新的ArrayList(Collections.singleton));
}
专用静态坡度合并(g1级、g2级){
g1.getStudents().addAll(g2.getStudents());
返回g1;
}
我认为使用带有合并功能的
toMap()
收集器更好

List<Grade> grades = new ArrayList<>(list.stream()
            .collect(Collectors
           .toMap(Student::getGrade, YOUR_CLASS::value, YOUR_CLASS::merge)).values()); 
List grades=newarraylist(List.stream()
.收藏(收藏家)
.toMap(Student::getGrade,YOUR_CLASS::value,YOUR_CLASS::merge)).values();

private静态成绩值(学生){
返回新的等级(s.getGrade(),新的ArrayList(Collections.singleton));
}
专用静态坡度合并(g1级、g2级){
g1.getStudents().addAll(g2.getStudents());
返回g1;
}

为什么不使用like:
Map collect=sList.stream().collect(Collectors.groupingBy(Student::getGrade))?好吧,这将起作用,只是它不会创建
Grade
实例。为什么不使用类似的:
Map collect=sList.stream().collect(Collectors.groupingBy(Student::getGrade))?好吧,那会有用的,只是它不会创建
Grade
实例。你不是简单地用
Grade
属性而不是名称来查看
groupBy
?然后,您的密钥和值对将组成
Grade
实例。简单地发布问题并去度假不是个好主意。你不是简单地用
grade
属性而不是名称来查看
groupBy
?然后,您的密钥和值对将组成
Grade
实例。简单地提出问题并去度假不是个好主意。