背景:需要获取两个或者多个list<对象>中的属性值,一般做法可以用嵌套循环。
避免多层for循环,可以先将一个list转为Map<id,vo>,然后遍历另一个list
Map<Integer, Student> studentMap = getStudentList().stream().collect(Collectors.toMap(Student::getSid,a->a,(k1,k2)->k2));
public class Demo {
public static void main(String[] args) {
//方法1:双层循环
for (Grade grade : getGradeList()) {
for (Student student : getStudentList()){
if (grade.getSid().equals(student.getSid())){
System.out.println("学号:"+grade.getSid()+",姓名:"+student.getName()+",成绩:"+grade.getScore());
}
}
}
//方法2:单层循环
//sid->Student 学号->学生对象
Map<Integer, Student> studentMap = getStudentList().stream().collect(Collectors.toMap(Student::getSid,a->a,(k1,k2)->k2));
for (Grade grade : getGradeList()) {
System.out.println("学号:"+grade.getSid()+",姓名:"+studentMap.get(grade.getSid()).getName()+",成绩:"+grade.getScore());
}
}
private static List<Student> getStudentList(){
List<Student> list = new ArrayList<>();
Student student = new Student();
student.setSid(11);
student.setName("小李");
list.add(student);
Student student2 = new Student();
student2.setSid(12);
student2.setName("小王");
list.add(student2);
return list;
}
private static List<Grade> getGradeList(){
List<Grade> list = new ArrayList<>();
Grade grade = new Grade();
grade.setId(1);
grade.setSid(11);
grade.setScore(80);
list.add(grade);
Grade grade2 = new Grade();
grade2.setId(2);
grade2.setSid(12);
grade2.setScore(90);
list.add(grade2);
return list;
}
}
@Data
class Student{
private Integer sid;
private String name;
}
@Data
class Grade{
private Integer id;
private Integer sid;
private Integer score;
}