2016-09-01 7 views
0

Для этого примера с игрушками у меня есть список классных комнат с идентификатором и именем. Я беру эти классные комнаты из источника данных, а затем, для каждого класса, мне потребуются ученики и списки учителей. Затем я хотел бы создать еще один объект, который принимает 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

хмм .. Я думал об обновлении 'fetchStudentsById', чтобы вернуть Map >, чтобы упростить – sidgate

ответ

1

Используйте Collectors.groupingBy, чтобы сгруппировать учащихся и учителей в списки того же идентификатора класса.

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()); 
Смежные вопросы