반응형
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 결과를 리턴받을 수 있다.
반응형
'Coding > Java' 카테고리의 다른 글
Java8 컬렉션 팩토리 생성 (List, Map, Set) (0) | 2021.08.01 |
---|---|
[Java8] Stream counting 개수 얻기 (0) | 2021.07.27 |
Java8 스트림 사용하여 특정 필드로 구성된 리스트 만들기 (0) | 2021.07.23 |
[Java] 배열 array 를 Collections.reverseOrder 사용하여 역순 정렬하기 (0) | 2021.07.05 |
[Java] Stream 사용하여 배열(array)의 max, min 구하기 (0) | 2021.07.05 |