请问下,我现在想把studentList装进teacherList里,请问用stream api该怎么做?

public class Test {
    public static void main(String[] args) {
        List<Teacher> teacherList = new ArrayList<>();
        Teacher t1 = new Teacher("1","zhangsan");
        Teacher t2 = new Teacher("2","lisi");
        teacherList.add(t1);
        teacherList.add(t2);


        Student s1 = new Student("1","wangwu","1");
        Student s2 = new Student("2","dingliu","2");
        Student s3 = new Student("3","heqi","1");
        Student s4 = new Student("4","dengba","2");
        List<Student> studentList = new ArrayList<>();
        studentList.add(s1);
        studentList.add(s2);
        studentList.add(s3);
        studentList.add(s4);
    }
}
class Teacher{
    String id;
    String name;
    List<Student> studentList;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Student> getStudentList() {
        return studentList;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }

    public Teacher(String id, String name) {
        this.id = id;
        this.name = name;
    }
}
class Student{
    String id;
    String name;
    String teacherId;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTeacherId() {
        return teacherId;
    }

    public void setTeacherId(String teacherId) {
        this.teacherId = teacherId;
    }

    public Student(String id, String name, String teacherId) {
        this.id = id;
        this.name = name;
        this.teacherId = teacherId;
    }
}
阅读 4k
3 个回答

题主你好,既然teacherstudent是一对多的关系,而且student里是有teacherId的属性的,那现在题主想把studentList装进teacherList,这个问题无非就是拆分为,怎么把studentList按照teacherId进行分组了

提到分组,结合stream api,那肯定想到了Collectors.groupingBy,所以我们直接分组得到Map<String, List<Student>>

Map<String, List<Student>> stringListMap = studentList.stream().collect(Collectors.groupingBy(Student::getTeacherId));

这个Map<String, List<Student>>key就是teacherId,而value就是对应的studentList

所以最后一步就很简单了,按照teacherList进行循环,然后从Mapget到对应的studentListset到对应的teacher

teacherList.forEach(teacher -> teacher.setStudentList(stringListMap.get(teacher.getId())));

虽然还是做了两次循环,不过我认为这个逃脱不了,两次循环是必要的,但是两次循环没有在同一次操作中进行,是分开的,所以瞬时的资源压力不大

以上是我的想法,希望对你有所帮助╰(●’◡’●)╮

teacherList.stream()
    .forEach(
        t -> stduentList.stream()
        .filter(s -> s.getTeacherId() == t.getId())
        .forEach(
            s -> t.getStudentList() == null 
                ? t.addStudentList(Arrays.asList(s))
                : t.getStudentList().add(s)
        )
    );

你的 Teacher 为什么没有 addStudent(Student student) 方法,外部每次添加学生都要判断一次老师的学生列表是否为 null.

因为老师不多,可以不先建映射表,直接遍历搜索匹配的老师

studentList.stream()
    .forEach(stu -> teacherList.stream()
        .filter(t -> t.getId() == stu.getTeacherId())
        .findFirst()
        .ifPresent(t -> {
            if (t.getStudentList() == null) {
                t.setStudentList(new ArrayList<Student>());
            }
            t.getStudentList().add(stu);
        }));
推荐问题