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) } 처럼 복잡한 수식을 분리한 함수를 넣을 경우에 사용하면 된다.