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 을 보여주는데 그것을 보고 이해하면 이해가 좀 쉽다.
댓글 없음:
댓글 쓰기