Java/연습문제

자바 연습문제 - Stream으로 객체 리스트를 그룹핑하기

코딩하는냥이 2025. 5. 26. 16:16
반응형

📖 문제

List에 저장되어 있는 Member 객체를 직업별로 그룹핑하여 Map<String, List<Member>> 객체로 생성하려고 합니다.

  • Map의 키는 Member의 직업
  • Map의 값은 해당 직업을 가진 Member 객체의 리스트

Collectors.groupingBy()를 활용해 문제를 해결해보세요.


📦 예제 클래스

Member.java

public class Member {
	private String name;
	private String job;

	public Member(String name, String job) {
		this.name = name;
		this.job = job;
	}

	public String getName() {
		return name;
	}

	public String getJob() {
		return job;
	}

	@Override
	public String toString() {
		return name + " (" + job + ")";
	}
}

Example.java

public class Example {
	public static void main(String[] args) {
		List<Member> list = Arrays.asList(
			new Member("홍길동", "개발자"),
			new Member("김일러", "디자이너"),
			new Member("파이썬", "개발자")
		);

		Map<String, List<Member>> groupingMap = list.stream()
			.collect(Collectors.groupingBy(m -> m.getJob()));

		System.out.println("[개발자]");
		List<Member> devList = groupingMap.get("개발자");
		devList.stream().forEach(System.out::println);
		System.out.println();

		System.out.println("[디자이너]");
		List<Member> desList = groupingMap.get("디자이너");
		desList.stream().forEach(System.out::println);
	}
}

💻 실행 결과

[개발자]
홍길동 (개발자)
파이썬 (개발자)

[디자이너]
김일러 (디자이너)

💬 코드 설명

  • .collect(Collectors.groupingBy(...))를 통해 스트림의 요소들을 지정한 기준(직업)으로 그룹핑합니다.
  • 반환된 Map에서 "개발자"와 "디자이너"를 키로 사용해 리스트를 추출합니다.
  • 각 그룹에 대해 forEach()를 사용해 Member 정보를 출력합니다.
  • toString()을 오버라이딩하면 출력이 더 보기 좋게 정리됩니다.

💡 학습 포인트

  1. Collectors.groupingBy() 사용법 익히기
    • 그룹핑 기준 필드를 지정하면 자동으로 Map으로 분류됩니다.
  2. Map<String, List<T>> 구조 이해하기
    • 키에 따라 데이터를 분류하는 실무 패턴을 이해할 수 있습니다.
  3. 스트림 후처리
    • 그룹핑 후 다시 Stream을 사용해 각 그룹의 데이터를 개별 출력할 수 있습니다.
  4. 출력 포맷을 위한 toString() 오버라이딩
    • 출력 결과를 보기 좋게 하기 위해 toString()을 재정의하는 습관은 실무에서도 유용합니다.

📌 마무리 정리

  • 작성하신 코드는 문제의 요구사항을 충실히 반영한 정확한 정답입니다.
  • 이 문제는 Stream의 고급 기능 중 하나인 그룹핑(groupingBy)을 연습할 수 있는 좋은 예제입니다.
  • 실무에서는 보고서, 통계, 필터링된 목록 분류 등 다양한 곳에 응용됩니다.