mapEffect

map과 완전히 동일합니다 — 함수의 진짜 목적이 부수 효과일 때 쓰는 명명 규칙입니다.

Iterable<B> mapEffect<A, B>(B Function(A a) f, Iterable<A> iterable) FxAsyncIterable<B> mapEffectAsync<A, B>(FutureOr<B> Function(A a) f, FxAsyncIterable<A> iterable) Fx<R> Fx.mapEffect<R>(R Function(T a) f) // chain FxAsync<R> FxAsync.mapEffect<R>(FutureOr<R> Function(T a) f)

강의

소스를 열어 보면 mapEffect는 말 그대로 B mapEffect(f, iterable) => map(f, iterable);입니다 — 같은 함수, 같은 지연 평가, 같은 시그니처죠. 오직 호출 지점에서 의도를 드러내기 위해 존재합니다. 콜백의 반환값보다 그 과정에서 벌어지는 일(로그 기록, DB 저장, 카운터 증가)이 더 중요하다면 mapEffect를, 반환값 자체가 목적이라면 map을 쓰세요.

단순한 별칭이므로 map에 대해 알고 있는 모든 것이 그대로 적용됩니다. 지연 평가되고, 비동기 쪽에서는 .concurrent(n)과 조합되며, 자체적인 에러 처리 같은 것도 없습니다. 동작상 어느 쪽을 골라야 할 이유는 없습니다 — 이 파이프라인을 다음에 읽을 사람(대개는 자기 자신)을 위한 가독성 신호일 뿐입니다.

데모 1 · 기본

콜백이 부수 효과를 기록하면서 변환된 값도 반환합니다 — map과 모양은 같지만 호출 지점에서의 의도가 다릅니다:

데모 2 · 비동기, 그리고 동시성

mapEffectAsyncmapAsync와 완전히 같은 엔진 위에서 돌아가므로 .concurrent(n)도 똑같이 병렬화해 줍니다 — "처리하고 저장하는" 파이프라인에 요긴합니다:

직접 해 보기

연습: mapEffect로 각 금액에 대해 'billing $<dollars>' 줄을 print하면서 센트를 달러로 변환해 보세요.

관련 항목: map — mapEffect가 그대로 위임하는 함수 · peek — 값을 전혀 바꾸지 않고 들여다보기 · flatMap — map + 평탄화 · concurrent — 병렬 평가