본문 바로가기
Issues

Java | flatMap(Arrays::stream) 활용하기

by YIAN 2021. 12. 14.

 

🧆 요구사항 (Requiredments)


객체 리스트에서 특정 변수만 뽑아서, split 한 다음에 map으로 만들려고 합니다. 제가 원하는 반환 타입은 List<String>이지만 실제 반환 타입은 List<String[]>로 나오기 때문에, 이를 바꿔줘야 합니다.

 

🍯 해결방안 (Solutions or Next step)


VO 객체에 있는 code 변수값을 기준으로 map을 사용하여 모아주고, 콤마를 기준으로 문자열을 split 하여 리스트로 만들 것입니다. 제가 처음에 생각했던 순서는 map > split > list 형태였는데, 수정하고 나서 순서는 map > split > flatMap > list입니다.

 

수정 전

List<String> resultList = sourceList.stream()
    .map(VO::getCode)
    .split(",")
    .collect(Collectors.toList());

 

수정 후

List<String> resultList = sourceList.stream()
    .map(VO::getCode)
    .map(list -> list.split(","))
    .flatMap(Arrays::stream)
    .distinct().collect(Collectors.toList());



flatMap은 생성된 스트림을 하나의 스트림으로 평면화시켜줍니다. 스트림의 각 값을 다른 스트림으로 만든 다음, 모든 스트림을 하나의 스트림으로 연결하는 기능을 한다고 합니다. map(Arrays::stream)은 각 배열을 별도의 스트림으로 생성하기 때문에 flapMap(Arrays::stream)과의 차이점은 각각 따로 만드느냐와 하나로 모아서 만드느냐의 차이로 보입니다.

 

🍪 회고 (Retrospect)


map 직전까지 만드는 과정이 헷갈렸는데요, split을 어떻게 처리해야 할지 모르겠더라고요. List<String[]> 형태로 되는 것에 대해 지인에게 물어봤었는데, 이렇게 설명을 해주더군요. a, b라는 문자열이 있고, 콤마를 기준으로 나누면 String[] str이라는 배열에 str[0] = a, str[1] = b 이런 형태로 들어가는 것과 같은 논리라고 했습니다. 이런 배열이 리스트인 것뿐이라고요. 그리고, 도서 『모던 자바 인 액션』 에서도 flatMap에 대한 내용을 다루고 있어서 참고했습니다.

 

코드를 작성할 때는 어려웠지만, flatMap(Arrays::stream)을 어떤 상황에 사용해야 할지 알게 되었습니다. 누군가에겐 쉬운 일도, 다른 누군가에게는 어려운 일일 수 있습니다. 하나씩 알아가는 기쁨을 누릴 수 있다는 것이 개발자의 장점 아닐까요?

 

🍓 참고자료 (References)

  • DogHujup, "[Java 8] Stream - 4 (flatMap, collect)", https://ocwokocw.tistory.com/58, (2021.11.10.)
  • 라울-게이브리얼우르마, 앨런마이크로프트, 마리오푸스코, 『모던 자바 인 액션(Modern Java in Action)』, 한빛미디어(2019), p163-p166

 

 

댓글