[Java] List<String>의 각 원소 고유문자 리턴하기 - Stream 평면화 과정 (flatMap 사용)

반응형
728x90
반응형

평면화 FlatMap

List<String>의 요소에 속하는 모든 고유문자를 리스트로 리턴받고 싶다. 아래의 과정을 걸쳐서 스트림 평면화를 진행하는 flatMap을 이해해보자.

우선, 우리가 하고싶은 상황은 아래와 같다.

이전: "AAA", "BBB", "CCC"
이후: "A", "A", "A", "B", "B", "B", "C", "C", "C"



과정1. Map 사용

// sample List 
List<String> wordList = Arrays.asList( "AAA", "BBB", "CCC" ); 

/* 원하는 결과 : List<String> / 결과 : List<String[]> */ 
List<String[]> productNameList = wordList.stream() 
			.map(word -> word.split("")) 
			.collect(Collectors.toList());
  • 1) 원하는 결과 : List<String>
  • 2) 실제 결과 : List<String[]>




과정2. map(Arrays::stream) 사용

아래 두줄의 코드로 얻고 싶은 상황이다.

// sample List 
String[] wordArray = {"AAA", "BBB", "CCC"}; 
Stream<String> wordStream = Arrays.stream(wordArray);


파이프라인을 사용하여 위 결과로 도출해보자.

// sample List 
List<String> wordList = Arrays.asList( "AAA", "BBB", "CCC" ); 

/* 결과 : List<Stream<String>> */ 
List<Stream<String>> productNameList2 = wordList.stream() 
			.map(word -> word.split("")) 
			.map(Arrays::stream) 
			.collect(Collectors.toList());

 

  • 1) 결과 : List<Stream<String>>




과정3. 스트림 평면화 flatMap

위 과정2에서 우리는 List<Stream<String>> 을 도출해냈다. flatMap 메서드를 사용하여 List<String>으로 결과를 리턴하도록 실행해보자.

  • 1) 각 단어를 개별 문자열로 이루어진 배열 생성 ("AAA", "BBB", "CCC")
  • 2) 각 배열을 별도의 스트림으로 생성 (Stream<String>)
  • 3) 스트림 평면화
// sample List 
List<String> wordList = Arrays.asList( "AAA", "BBB", "CCC" ); 

/** flatMap 사용 */ 
List<String> productNameList3 = wordList.stream() 
			.map(word -> word.split("")) // 1) 
			.flatMap(Arrays::stream) // 2) + 3) 
			.collect(Collectors.toList());


1) .map(word -> word.split(""))

Stream<String[]> 의 "AAA", "BBB", "CCC"

-> 각 단어를 개별로 가지는 배열을 가지게된다.

2) .flatMap(Arrays::stream)

Stream<String> 의 "A", "A", "A", "B", "B", "B", "C", "C", "C"

-> 생성된 스트림을 평면화한다.

  • 1) 원하는 결과 : List<String>
  • 2) 실제 결과 : List<String>



중복 제거

추가로, 위 코드로 도출된 List<String> 에서 중복된 요소를 제거해보자.

// sample List 
List<String> wordList = Arrays.asList( "AAA", "BBB", "CCC" ); 

/** flatMap 사용 */ 
List<String> productNameList3 = wordList.stream() 
			.map(word -> word.split("")) 
			.flatMap(Arrays::stream) 
			.distinct() 
			.collect(Collectors.toList());

 

.distinct()가 추가되어 중복이 제거된 "A", "B", "C"를 가진 String 타입의 List 결과를 리턴받을 수 있다.

 

반응형

Designed by JB FACTORY