rxjava : flatMap、flatMapIterable、flatMapMaybe、flatMapCompletable、flatMapSingle

本文深入解析RxJava中的flatMap操作符,介绍其不同变种及其参数含义,包括mapper、combiner、delayErrors、maxConcurrency等。通过示例代码展示如何使用flatMap处理数据流,实现数据的转换和平铺,特别关注错误处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flatMap

返回一个Observable,它向源ObservableSource和指定的集合ObservableSource发出的一对值发射指定函数的结果,
同时限制对这些ObservableSources的并发预订的最大数量

public final <R> Observable<R> flatMap(
					Function<? super T, ? extends ObservableSource<? extends R>> mapper) {
    return flatMap(mapper, false);
}


public final <R> Observable<R> flatMap(
					Function<? super T, ? extends ObservableSource<? extends R>> mapper, 
					boolean delayErrors) {
    return flatMap(mapper, delayErrors, Integer.MAX_VALUE);
}


//bufferSize() = 128
public final <R> Observable<R> flatMap(
					Function<? super T, ? extends ObservableSource<? extends R>> mapper, 
					boolean delayErrors, 
					int maxConcurrency) {
    return flatMap(mapper, delayErrors, maxConcurrency, bufferSize());	
}


public final <R> Observable<R> flatMap(
					Function<? super T, ? extends ObservableSource<? extends R>> mapper,
			        boolean delayErrors, 
			        int maxConcurrency, 
			        int bufferSize) {


public final <R> Observable<R> flatMap(
        Function<? super T, ? extends ObservableSource<? extends R>> onNextMapper,
        Function<? super Throwable, ? extends ObservableSource<? extends R>> onErrorMapper,
        Callable<? extends ObservableSource<? extends R>> onCompleteSupplier) {


public final <R> Observable<R> flatMap(
        Function<? super T, ? extends ObservableSource<? extends R>> onNextMapper,
        Function<Throwable, ? extends ObservableSource<? extends R>> onErrorMapper,
        Callable<? extends ObservableSource<? extends R>> onCompleteSupplier,
        int maxConcurrency) {


public final <R> Observable<R> flatMap(
		Function<? super T, ? extends ObservableSource<? extends R>> mapper, 
		int maxConcurrency) {
    return flatMap(mapper, false, maxConcurrency, bufferSize());
}


public final <U, R> Observable<R> flatMap(
		Function<? super T, ? extends ObservableSource<? extends U>> mapper,
        BiFunction<? super T, ? super U, ? extends R> resultSelector) {
    return flatMap(mapper, resultSelector, false, bufferSize(), bufferSize());
}


public final <U, R> Observable<R> flatMap(
		Function<? super T, ? extends ObservableSource<? extends U>> mapper,
		BiFunction<? super T, ? super U, ? extends R> combiner, 
		boolean delayErrors) {
    return flatMap(mapper, combiner, delayErrors, bufferSize(), bufferSize());
}


public final <U, R> Observable<R> flatMap(
		Function<? super T, ? extends ObservableSource<? extends U>> mapper,
		BiFunction<? super T, ? super U, ? extends R> combiner, 
		boolean delayErrors, 
		int maxConcurrency) {
    return flatMap(mapper, combiner, delayErrors, maxConcurrency, bufferSize());
}



public final <U, R> Observable<R> flatMap(
		Function<? super T, ? extends ObservableSource<? extends U>> mapper,
        BiFunction<? super T, ? super U, ? extends R> combiner, 
        int maxConcurrency) {
    return flatMap(mapper, combiner, false, maxConcurrency, bufferSize());
}


// mapper (映射器) : 为源ObservableSource发出的每个项目返回ObservableSource的函数
// combiner	(结合): 一个函数,它将源和集合ObservableSources的每一个发出的一项组合在一起,
//				并且返回要由结果ObservableSource发出的一项
// delayErrors (延迟错误): 
//		如果为true,则将当前Observable和所有内部ObservableSource的异常延迟到它们全部终止之前
//	 	如果为false,则第一个发出异常的信号将立即终止整个序列
// maxConcurrency (最大并发): 可以同时订阅的ObservableSources的最大数量
// bufferSize (缓冲区大小): 要从内部ObservableSources中预取的元素数。
public final <U, R> Observable<R> flatMap(
		final Function<? super T, ? extends ObservableSource<? extends U>> mapper,
        final BiFunction<? super T, ? super U, ? extends R> combiner, 
        boolean delayErrors, 
        int maxConcurrency, 
        int bufferSize) 

flatMapIterable


public final <U> Observable<U> flatMapIterable(
		final Function<? super T, ? extends Iterable<? extends U>> mapper) 


public final <U, V> Observable<V> flatMapIterable(
		final Function<? super T, ? extends Iterable<? extends U>> mapper,
        BiFunction<? super T, ? super U, ? extends V> resultSelector)

flatMapMaybe

将上游Observable的每个元素映射到MaybeSources中,
订阅所有元素并将它们的onSuccess值以不特定的顺序合并到单个Observable序列中。

public final <R> Observable<R> flatMapMaybe(
		Function<? super T, ? extends MaybeSource<? extends R>> mapper) {
    return flatMapMaybe(mapper, false);
}


//delayErrors : 延迟错误
public final <R> Observable<R> flatMapMaybe(
		Function<? super T, ? extends MaybeSource<? extends R>> mapper, 
		boolean delayErrors) 

flatMapCompletable

将上游Observable的每个元素映射到CompletableSources中,对其进行订阅,
并等待上游和所有CompletableSources完成,从而有选择地延迟所有错误。

public final Completable flatMapCompletable(
		Function<? super T, ? extends CompletableSource> mapper) {
    return flatMapCompletable(mapper, false);
}

//delayErrors : 延迟错误
public final Completable flatMapCompletable(
		Function<? super T, ? extends CompletableSource> mapper, 
		boolean delayErrors) 

flatMapSingle

将上游Observable的每个元素映射到SingleSources中,
并对其进行订阅并将它们的onSuccess值【以不特定顺序】合并到单个Observable序列中,
可以选择延迟所有错误。

public final <R> Observable<R> flatMapSingle(
			Function<? super T, ? extends SingleSource<? extends R>> mapper) {
    return flatMapSingle(mapper, false);
}


//delayErrors : 延迟错误
public final <R> Observable<R> flatMapSingle(
			Function<? super T, ? extends SingleSource<? extends R>> mapper, 
			boolean delayErrors) 

示例

  • flatMap 示例
//正常发射
public void flatMap1() {
    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onNext(3);
            emitter.onComplete();
        }
    }).flatMap(
            new Function<Integer, ObservableSource<Integer>>() {
                /**
                 * @param integer 原始Observable发出的数据
                 */
                @Override
                public ObservableSource<Integer> apply(Integer integer) throws Exception {
                    System.out.println("Function 原始Observable============" + integer);
                    return Observable.just(integer * 100);
                }
            },
            new BiFunction<Integer, Integer, Integer>() {
                /**
                 * @param integer   : 原始Observable发出的数据
                 * @param integer2  : flatmap里Observable发出的的数据
                 */
                @Override
                public Integer apply(Integer integer, Integer integer2) throws Exception {
                    System.out.println("====BiFunction 原始Observable=========" + integer);
                    System.out.println("====BiFunction flatmap里Observable====" + integer2);
                    return integer * integer2;
                }
            },
            true,
            Observable.bufferSize(),
            Observable.bufferSize())
            .subscribe(new Observer<Integer>() {
                @Override
                public void onSubscribe(Disposable d) {
                    System.out.println("=========onSubscribe=========");
                }

                @Override
                public void onNext(Integer integer) {
                    System.out.println("========onNext==========" + integer);
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("========onError==========" + e.getMessage());
                }

                @Override
                public void onComplete() {
                    System.out.println("=========onComplete=========");
                }
            });
}
//=========onSubscribe=========
//Function 原始Observable============1
//====BiFunction 原始Observable=========1
//====BiFunction flatmap里Observable====100
//========onNext==========100
//Function 原始Observable============2
//====BiFunction 原始Observable=========2
//====BiFunction flatmap里Observable====200
//========onNext==========400
//Function 原始Observable============3
//====BiFunction 原始Observable=========3
//====BiFunction flatmap里Observable====300
//========onNext==========900
//=========onComplete=========



//发射error
public void flatMap2() {
    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onError(new Error("=error="));
            emitter.onNext(3);
            emitter.onComplete();
        }
    }).flatMap(
            new Function<Integer, ObservableSource<Integer>>() {
                /**
                 * @param integer 原始Observable发出的数据
                 */
                @Override
                public ObservableSource<Integer> apply(Integer integer) throws Exception {
                    System.out.println("Function 原始Observable============" + integer);
                    return Observable.just(integer * 100);
                }
            },
            new BiFunction<Integer, Integer, Integer>() {
                /**
                 * @param integer   : 原始Observable发出的数据
                 * @param integer2  : flatmap里Observable发出的的数据
                 */
                @Override
                public Integer apply(Integer integer, Integer integer2) throws Exception {
                    System.out.println("====BiFunction 原始Observable===========" + integer);
                    System.out.println("====BiFunction flatmap里Observable======" + integer2);
                    return integer * integer2;
                }
            },
            true,
            Observable.bufferSize(),
            Observable.bufferSize())
            .subscribe(new Observer<Integer>() {
                @Override
                public void onSubscribe(Disposable d) {
                    System.out.println("=========onSubscribe=========");
                }

                @Override
                public void onNext(Integer integer) {
                    System.out.println("========onNext==========" + integer);
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("========onError==========" + e.getMessage());
                }

                @Override
                public void onComplete() {
                    System.out.println("=========onComplete=========");
                }
            });
}
//=========onSubscribe=========
//Function 原始Observable============1
//====BiFunction 原始Observable===========1
//====BiFunction flatmap里Observable======100
//========onNext==========100
//Function 原始Observable============2
//====BiFunction 原始Observable===========2
//====BiFunction flatmap里Observable======200
//========onNext==========400
//========onError===========error=

  • flatMapCompletable示例
/**
 * 我们最终只需要知道成功还是失败可以使用flatMapCompletable
 */

//=======================================================================
//  delayErrors = false
//  flatMapCompletable 处理发射的数据并添加onComplete、onError 直接回调结束
//=======================================================================

public void flatMapCompletable1() {
    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onNext(3);
            emitter.onNext(4);
            emitter.onNext(5);
            emitter.onNext(6);
            emitter.onNext(7);
            emitter.onNext(8);
            emitter.onNext(9);
            emitter.onNext(10);
        }
    }).flatMapCompletable(
            new Function<Integer, CompletableSource>() {
                @Override
                public CompletableSource apply(Integer integer) throws Exception {
                    System.out.println("========flatMapCompletable======" + integer);
                    if (integer % 2 == 0) {
                        return Completable.error(new Throwable("-error-"));
                    } else {
                        return Completable.complete();
                    }
                }
            },
            false)
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {
                    System.out.println("========onSubscribe==========");
                }

                @Override
                public void onComplete() {
                    System.out.println("========onComplete==========");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("========onError==========" + e.getMessage());
                }
            });
}
//========onSubscribe==========
//========flatMapCompletable======1
//========flatMapCompletable======2
//========onError==========-error-

public void flatMapCompletable2() {
    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onNext(3);
            emitter.onNext(4);
            emitter.onNext(5);
            emitter.onNext(6);
            emitter.onError(new Error("-error-"));
            emitter.onNext(7);
            emitter.onNext(8);
            emitter.onNext(9);
            emitter.onNext(10);
        }
    }).flatMapCompletable(
            new Function<Integer, CompletableSource>() {
                @Override
                public CompletableSource apply(Integer integer) throws Exception {
                    System.out.println("========flatMapCompletable======" + integer);
                    if (integer % 2 == 0) {
                        return Completable.error(new Throwable("-error-"));
                    } else {
                        return Completable.complete();
                    }
                }
            },
            false)
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {
                    System.out.println("========onSubscribe==========");
                }

                @Override
                public void onComplete() {
                    System.out.println("========onComplete==========");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("========onError==========" + e.getMessage());
                }
            });
}
//========onSubscribe==========
//========flatMapCompletable======1
//========flatMapCompletable======2
//========onError==========-error-


public void flatMapCompletable3() {
    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onNext(3);
            emitter.onNext(4);
            emitter.onNext(5);
            emitter.onNext(6);
            emitter.onComplete();
            emitter.onNext(7);
            emitter.onNext(8);
            emitter.onNext(9);
            emitter.onNext(10);
        }
    }).flatMapCompletable(
            new Function<Integer, CompletableSource>() {
                @Override
                public CompletableSource apply(Integer integer) throws Exception {
                    System.out.println("========flatMapCompletable======" + integer);
                    if (integer % 2 == 0) {
                        return Completable.error(new Throwable("-error-"));
                    } else {
                        return Completable.complete();
                    }
                }
            },
            false)
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {
                    System.out.println("========onSubscribe==========");
                }

                @Override
                public void onComplete() {
                    System.out.println("========onComplete==========");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("========onError==========" + e.getMessage());
                }
            });
}
//========onSubscribe==========
//========flatMapCompletable======1
//========flatMapCompletable======2
//========onError==========-error-

//=======================================================================
//  delayErrors = true
//  flatMapCompletable 处理发射的数据并添加onComplete、onError 
//  但不会结束,直到Observable 发射onComplete、onError 结束
//=======================================================================

public void flatMapCompletable4() {
    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onNext(3);
            emitter.onNext(4);
            emitter.onNext(5);
            emitter.onNext(6);
            emitter.onNext(7);
            emitter.onNext(8);
            emitter.onNext(9);
            emitter.onNext(10);
        }
    }).flatMapCompletable(
            new Function<Integer, CompletableSource>() {
                @Override
                public CompletableSource apply(Integer integer) throws Exception {
                    System.out.println("========flatMapCompletable======" + integer);
                    if (integer % 2 == 0) {
                        return Completable.error(new Throwable("-error-"));
                    } else {
                        return Completable.complete();
                    }
                }
            },
            true)
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {
                    System.out.println("========onSubscribe==========");
                }

                @Override
                public void onComplete() {
                    System.out.println("========onComplete==========");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("========onError==========" + e.getMessage());
                }
            });
}
//========onSubscribe==========
//========flatMapCompletable======1
//========flatMapCompletable======2
//========flatMapCompletable======3
//========flatMapCompletable======4
//========flatMapCompletable======5
//========flatMapCompletable======6
//========flatMapCompletable======7
//========flatMapCompletable======8
//========flatMapCompletable======9
//========flatMapCompletable======10

public void flatMapCompletable5() {
    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onNext(3);
            emitter.onNext(4);
            emitter.onNext(5);
            emitter.onNext(6);
            emitter.onError(new Error("-error-"));
            emitter.onNext(7);
            emitter.onNext(8);
            emitter.onNext(9);
            emitter.onNext(10);
        }
    }).flatMapCompletable(
            new Function<Integer, CompletableSource>() {
                @Override
                public CompletableSource apply(Integer integer) throws Exception {
                    System.out.println("========flatMapCompletable======" + integer);
                    if (integer % 2 == 0) {
                        return Completable.error(new Throwable("-error-"));
                    } else {
                        return Completable.complete();
                    }
                }
            },
            true)
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {
                    System.out.println("========onSubscribe==========");
                }

                @Override
                public void onComplete() {
                    System.out.println("========onComplete==========");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("========onError==========" + e.getMessage());
                }
            });
}
//========onSubscribe==========
//========flatMapCompletable======1
//========flatMapCompletable======2
//========flatMapCompletable======3
//========flatMapCompletable======4
//========flatMapCompletable======5
//========flatMapCompletable======6
//========onError==========4 exceptions occurred.


public void flatMapCompletable6() {
    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onNext(3);
            emitter.onNext(4);
            emitter.onNext(5);
            emitter.onNext(6);
            emitter.onComplete();
            emitter.onNext(7);
            emitter.onNext(8);
            emitter.onNext(9);
            emitter.onNext(10);
        }
    }).flatMapCompletable(
            new Function<Integer, CompletableSource>() {
                @Override
                public CompletableSource apply(Integer integer) throws Exception {
                    System.out.println("========flatMapCompletable======" + integer);
                    if (integer % 2 == 0) {
                        return Completable.error(new Throwable("-error-"));
                    } else {
                        return Completable.complete();
                    }
                }
            },
            true)
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {
                    System.out.println("========onSubscribe==========");
                }

                @Override
                public void onComplete() {
                    System.out.println("========onComplete==========");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("========onError==========" + e.getMessage());
                }
            });
}
//========onSubscribe==========
//========flatMapCompletable======1
//========flatMapCompletable======2
//========flatMapCompletable======3
//========flatMapCompletable======4
//========flatMapCompletable======5
//========flatMapCompletable======6
//========onError==========3 exceptions occurred.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值