[컴] reactor의 flatMap vs map

reactor flatMap map / 차이 / flatmap, map 차이

reactor의 flatMap vs map

map 을 이용하면, 즉 map 의 mapper function 은 parameter 로 특정 type (여기서는 U라고 하자.)의 object 를 받게된다. 그러면, 이것에 대한 Flux 가 만들어진다.

이때 하나의 thread 로 작업(mapper)을 처리하기 때문에, order(순서)는 유지된다.

flatMap 의 mapper function 에서는 parameter 로 특정 type 의 Publisher<U> 를 받는다. 그리고 이 Publisher<U>를 return 한다. 그러면 이것에 대한 Flux<U> 가 만들어진다. 만약 map 을 이용해서 mapper function 에서 Publisher<U>를 return 했다면, Flux<Publisher<U>> 가 됐을 것이다.

ref 2

- `map` takes a `Function<T, U>` and returns a `Flux<U>`
- `flatMap` takes a `Function<T, Publisher<V>>` and returns a `Flux<V>`

위 표현은 개인적으로 혼란스럽다. 오히려 같은 parameter 를 가질때를 비교하는 것이 좀 더 명쾌하다.

위 kotlin 코드에서 보듯이, parameter 로 넘어오는 값들은 map 을 쓰나, flatMap 을 쓰나 다르지 않다. 다만 return 값이 달라진다. 위의 코드에서 보듯이, 

  • map 을 하면, return 한 값이 그대로 다음 stream 의 parameter 로 넘어간다.
    [1], [2], [3], ...
  • 그런데 flatMap 을 쓰면, return 으로 Mono 를 보내도, 다음 stream 에는 Mono 는 벗겨내고, 그 안의 내용(contents) 만 parameter 로 받는다.
    [1, 2, 3, ...]

즉 return 값의 변화가 필요하다면, 또는 변화가 생긴다면 flatMap 을 쓰면 된다. 개인적으로는 IntelliJ 에서 미리 parameter 로 받게되는 type 을 보여주는데 그것을 보고 이해하면 이해가 좀 쉽다.

Reference

  1. Project Reactor: map() vs flatMap() | Baeldung
  2. java - map vs flatMap in reactor - Stack Overflow

댓글 없음:

댓글 쓰기