LiveData overview  |  App architecture  |  Android Developers

Transformations

LiveData 객체에 연쇄적으로 반응하도록 하는 체이닝 LiveData를 만들어주는 거라고 생각하면 좋다

해당 객체에는 map, switchMap 두 가지 메서드가 들어가 있다

@MainThread
@NonNull
public static <X, Y> LiveData<Y> map(
        @NonNull LiveData<X> source,
        @NonNull final Function<X, Y> mapFunction) {
    final MediatorLiveData<Y> result = new MediatorLiveData<>();
    result.addSource(source, new Observer<X>() {
        @Override
        public void onChanged(@Nullable X x) {
            result.setValue(mapFunction.apply(x));
        }
    });
    return result;
}
@MainThread
@NonNull
public static <X, Y> LiveData<Y> switchMap(
        @NonNull LiveData<X> source,
        @NonNull final Function<X, LiveData<Y>> switchMapFunction) {
    final MediatorLiveData<Y> result = new MediatorLiveData<>();
    result.addSource(source, new Observer<X>() {
        LiveData<Y> mSource;

        @Override
        public void onChanged(@Nullable X x) {
            LiveData<Y> newLiveData = switchMapFunction.apply(x);
            if (mSource == newLiveData) {
                return;
            }
            if (mSource != null) {
                result.removeSource(mSource);
            }
            mSource = newLiveData;
            if (mSource != null) {
                result.addSource(mSource, new Observer<Y>() {
                    @Override
                    public void onChanged(@Nullable Y y) {
                        result.setValue(y);
                    }
                });
            }
        }
    });
    return result;
}

쉽게 말해, map은 값을 반환하는 람다를 받아서 그걸 실행한 값을 넣은 LiveData 반환이고,

switchMap은 LiveData를 반환하는 람다를 받아서 그걸 실행한 값을 넣은 LiveData를 반환한다

map은 { value → value * value } 처럼 간단한 수식을 넣을 경우에 사용하고 switchMap은 { value → getSomeThing(value) } 처럼 복잡한 수식을 분리한 함수를 넣을 경우에 사용하면 된다.