Użyj Transformer który modyfikuje źródło obserwowalne, nazywając się flatMap
na nim z funkcji. Można myśleć o tym jako o procesie 2-etapowym:
- Funkcja przyjmuje każdą emitowanego element (
Iterable<T>
) i ponownie emituje go jako Observable<T>
flatMap
zajmuje każda z tych emitowanego Observable<T>
obiektów je łączy w jeden Observable<T>
Transformer wygląda następująco:
public class FlattenTransform<T> implements Observable.Transformer<Iterable<T>, T> {
@Override
public Observable<? extends T> call(Observable<? extends Iterable<T>> source) {
return source.flatMap(new Func1<Iterable<T>, Observable<T>>() {
@Override
public Observable<T> call(Iterable<T> values) {
return Observable.from(values);
}
});
}
}
Po utworzeniu Transformer, można użyć compose
zastosować transformację od źródła do zaobserwowania:
public class Example {
private static final ArrayList<Long> sourceList = new ArrayList<>(Arrays.asList(new Long[] {1L,2L,3L}));
private static final Observable<ArrayList<Long>> listObservable = Observable.just(sourceList);
private static final FlattenTransform<Long> flattenList = new FlattenTransform<Long>();
public static void main(String[] args) {
listObservable.compose(flattenList).subscribe(printItem);
}
private static Action1<Long> printItem = new Action1<Long>() {
@Override
public void call(Long item) {
System.out.println("item: " + item);
}
};
}
Zaletą korzystania z compose
z Transformer
zamiast flatMap
z Func1
jest to, że jeśli w przyszłość, jeśli chcesz ponownie spłaszczyć listę, nie musisz nawet myśleć o tym, którego operatora użyć (mapa? flatMap? concatMap?). Innymi słowy, operacja na mapie liniowej jest wypalana w klasie FlattenTransform i ten szczegół jest usuwany.
Transformatory mają również inne zalety, takie jak możliwość łączenia wielu operacji.
nakazuje ważne? – lopar
Niezupełnie, ale dla celów edukacyjnych naprawdę lubię widzieć obie wersje: –