2016-09-01 7 views
0

このおもちゃの例では、IDと名前を持つClassroomsのリストがあります。データソースからこれらの教室を取り出し、教室ごとに学生と教師のリストを取得する必要があります。私はclassroom.id、classroom.nameとList<Student>, List<Teacher>というFooという別のオブジェクトを作成したいと考えています。 Fooである問題は不変オブジェクトであり、すべての情報が利用可能な場合にインスタンス化する必要があります。ここで私が試したことは次のとおりです:オブジェクトの関連階層を効率的に構築する

List<Classroom> classrooms = dataSource.fetchClassroomsById(classroomIds); 
Map<Integer, Classroom> idToClassroom = new HashMap<>(); 
     classrooms.stream() 
      .forEach(classroom -> {idToClassroom.put(classroom.getId(), classroom);}); 

//get all students and teachers that belong to set of classroomIds passed in 
List<Student> students = dataSource.fetchStudentsById(classroomIds); 
List<Teacher> teachers = dataSource.fetchTeachersById(classroomIds); 

for (Student student : students) { 
    //gets the classroom for which student belongs. This is where I get stuck. 
    idsToClassroom.get(student.getClassRoomId()) 
} 
... 

基本的に、私はどのように効率的かつコンパクトにこの時点で私のFooオブジェクトを構築できますか?

+0

'datasource'とは何ですか?あなたは 'datasource'コードを変更できますか? – sidgate

+0

@sidgateいいえ、ここでは抽象化していません。それを変更したり、手を加えたりすることはできないものとします。それは –

+0

のように提供されています.hmm .. 'fetchStudentsById'を更新して、Map >を返すようにしていました。 – sidgate

答えて

1

Collectors.groupingByを使用して、同じ教室IDのリストの生徒と教師をグループ化します。

List<Classroom> classrooms = dataSource.fetchClassroomsById(classroomIds); 
List<Student> students = dataSource.fetchStudentsById(classroomIds); 
List<Teacher> teachers = dataSource.fetchTeachersById(classroomIds); 

Map<Integer, List<Student>> classroomIdToStudent = students.stream() 
    .collect(Collectors.groupingBy(Student::getClassroomId)); 

Map<Integer, List<Teacher>> classroomIdToTeacher = teachers.stream() 
    .collect(Collectors.groupingBy(Teacher::getClassroomId)); 

List<Foo> foos = classrooms.stream().map(c -> new Foo(c.getId(), c.getName(), 
    classroomIdToStudent.get(c.getId()), classroomIdToTeacher.get(c.getId()))).collect(Collectors.toList()); 
関連する問題