map / flatMap 은 언제 사용해야 하나
map / flatmap 둘다 스트림의 중간에 값을 변환해주는 역할을 한다.
map은 1 : 1로 반환을 보증하고 flatMap은 1 : N을 변환할 수 있다.
Mono와 달리 Flux 는 비동기로 병렬 동작하는 publisher 를 사용하는 경우
성능상 이점이 많기 때문에 되도록 flatMap 을 사용하는게 좋다.
reactive한 개발을 하면 사용하는 모든 method의 반환은 publisher 형태가 된다.
이렇게 반환된 결과값을 사용해야 하는 경우에는 map 보다 flatMap 을 사용할 때 자연스럽게 이어진다.
이러한 경우 때문에 Mono<T> -> Mono<T> 의 경우에도 flatMap을 사용하게 된다.
동기 처리 부분은 map
비동기 처리부분은 flatmap 함수를 사용한다.
map()
map()은 단일 스트림의 원소를 매핑시킨 후 매핑시킨 값을 다시 스트림으로 변환하는 중간 연산을 담당한다.
객체에서 원하는 원소를 추출해는 역할을 한다고 말할 수 있다.
너무 많은 map 함수의 조합은 연산마다 객체를 생성하므로 GC의 대상이 많아지는 단점이 있다.
예제
Persion.java
class Person {
String name;
String email;
...
}
PersonTest.java
List<Person> test = Arrays.asList(
new Person("kim","kim@email.com");
new Person("lee","lee@email.com");
new Person("park","park@email.com");
);
Stream<String> mapStream = test.stream().map(person -> person.getName());
결과
kim
lee
park
flatMap()
flatMap()은 Array나 Object로 감싸져 있는 모든 원소를 단일 원소 스트림으로 반환한다.
map()은 입력한 원소를 그대로 스트림으로 반환하지만 flatMap()은 입력한 원소를 가장 작은 단위의 단일 스트림으로 반환한다.
flatMapTest.java
String[][] sample = new String[][]{
{"a", "b"}, {"c", "d"}, {"e", "a"}, {"a", "h"}, {"i", "j"}
};
//without .flatMap()
Stream<String> stream = sample.stream()
.flatMap(array -> Arrays.stream(array))
.filter(x-> "a".equals(x));
stream.forEach(System.out::println);
결과
a
a
a
이러한 내용들로 인해 대부분 flatMap 을 사용하지만
무조건 flatMap 을 사용하는 것이 아닌 위의 내용을 이해하고 개발하면 좋을 듯하여 정리해 보았다.
참고
https://luvstudy.tistory.com/95
https://qkrrudtjr954.github.io/java/2017/10/15/difference-between-map-and-flatMap.html
'공부 > Spring' 카테고리의 다른 글
Reactive Streams (0) | 2022.04.16 |
---|---|
[webflux] PublishOn, SubscribeOn (0) | 2022.04.15 |
Spring WebFlux (0) | 2022.04.14 |
[Intellij] JUnit Test 실행 시 No tests found for given includes (0) | 2022.04.14 |
[spring] @Test 빌드시 ' Cannot find symbol method' 에러 (0) | 2022.04.13 |