2017-11-09 5 views
3

필자는 요소 목록을 가지고 있으며이 목록 유형의 특정 요소로 그룹화하고 중첩 컬렉션으로 변환해야합니다.플랫 목록 요소를 Java의 중첩 된 컬렉션으로 변환

class StudentA { 
    private String name; 
    private int age; 
    private int subjectId; 
    private String subjectName; 
} 

class StudentB { 
    private String name; 
    private int age; 
    List<Subject> subject; 
} 

class Subject { 
    private int subjectId; 
    private String subjectName; 
} 

내 입력으로 List<StudentA>이 - 여기에 내가

아래 고려, 무얼 것입니다. 그러나이 목록에서 각 학생은 여러 과목을 가질 수 있으므로 학생 정보가 반복됩니다 (예 : [new StudentA("A",22,1,"X"), new StudentA("A",22,2,"Y"), new StudentA("B",24,1,"X") ] 등). 이 좋은 표현하지 않고 내가 StudentB는 요소로 주제의 목록을 가지고 아래 포맷팅 및

List<StudentB> 

참고 자료가 필요합니다. 여기

내가, 내가 원래 목록의 각 요소를 통해 반복하고 나는 또한 java8 스트림 보았다
  • 필요한 구성

    • 일반 오래된 반복적 인 방법을 생각하지만, 확신하고 있지 않다 무엇인가 , 을 약속 같은데 수집 된 데이터를 GROUPBY이 API는하지만 난 내 StudentB 유형 목록에 studentA에 유형으로 변환 할 수없는 것

    이것을 수행하기위한 좋은 방법은 무엇입니까? 감사합니다 !

  • 답변

    3

    StudentA의 인스턴스를 이름으로 그룹화하면 Map<String,List<StudentA>>이 표시됩니다. 그런 다음 당신이지도의 값을 스트리밍 StudentB의 인스턴스로 변환 할 수 있습니다

    List<StudentB> bList = 
        aList.stream() // Stream<StudentA> 
         .collect(Collectors.groupingBy(StudentA::getName)) // Map<String,List<StudentA>> 
         .values() // Collection<List<StudentA>> 
         .stream() // Stream<List<StudentA>> 
         .map(list -> { 
          StudentB b = new StudentB(); 
          b.setName(list.get(0).getName()); 
          b.setAge(list.get(0).getAge()); 
          list.forEach(a -> b.addSubject(new Subject(a.getSubjectID(),a.getSubjectName()))); 
          return b; 
         }) // Stream<StudentB> 
         .collect(Collectors.toList()); 
    

    나는 어떤 방법 이름과 생성자의 존재를 가정의 자유를했다.

    이 솔루션은 동일한 Subject에 대해 복수 Subject 인스턴스를 잠재적으로 만들 수있는 단점이 있습니다. ID가 인덱싱 된 Subject이 포함 된 Map<Integer,Subject>을 만들고 필요한 제목 ID가 아직 Map이 아닌 경우에만 새 Subject을 생성하면 피할 수 있습니다.

    +0

    감사합니다. 정확히 내가 무엇을 찾고 있었는지. 그리고, 동일한 주제에 대해 Subject의 여러 인스턴스를 작성하면됩니다. 나는 수천을 여기에서 다루지 않고있다 – ranjith

    +0

    멋진 예! – HopeKing