日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

RxJava 中的Map函数原理分析

發(fā)布時(shí)間:2025/3/20 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxJava 中的Map函数原理分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先看一段Map函數(shù)的使用代碼:

Observable.create(new Observable.OnSubscribe<Integer>() {@Overridepublic void call(Subscriber<? super Integer> subscriber) {subscriber.onNext(123);}}).map(new Func1<Integer, String>() {@Overridepublic String call(Integer integer) {return integer.toString();}}).subscribe(new Subscriber<String>() {public static final String TAG ="Test" ;@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(String s) {Log.d(TAG, "onNext: "+s);}});

Observable<Integer>Observable1=Observable.create(new Observable.OnSubscribe<Integer>() {
? ? @Override

? ? public void call(Subscriber<? super Integer> subscriber) { subscriber.onNext(123); }

? });

create函數(shù)構(gòu)建了一個(gè)新的Observable 在Observable的構(gòu)造函數(shù)中將Observable.onSubscribe屬性賦值為 Observable.OnSubscribe<Integer>;
Observable<String> Observable2= Observable1.map(new Func1<Integer, String>() {
? ? ?@Override
? ? ?public String call(Integer integer) {
? ? ?return null;
? ?}});
通過 map函數(shù)構(gòu)建了一個(gè)新的Observable
map函數(shù)源碼:
public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
? ? ?return lift(new OperatorMap<T, R>(func));
}
在map源碼中首先通過func(這里的func指的就是Func1<Integer, String>())參數(shù)構(gòu)建一個(gè)OperatorMap類;
public OperatorMap(Func1<? super T, ? extends R> transformer) {
? ?this.transformer = transformer;
}
OperatorMap.transformer 也指向了Func1<Integer, String>();

lift函數(shù)里面創(chuàng)建了一個(gè)新的Observable,而上邊的Observable<String> Observable2也就是lift函數(shù)創(chuàng)建的;
public final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator) {
return new Observable<R>(new OnSubscribeLift<T, R>(onSubscribe, operator));
}
public final class OnSubscribeLift<T, R> implements OnSubscribe<R>

在構(gòu)造函數(shù)中傳了一個(gè)OnSubscribeLift對(duì)象,因此Observable2.onSubscribe 也就指向了OnSubscribeLift;

public OnSubscribeLift(OnSubscribe<T> parent, Operator<? extends R, ? super T> operator) {
this.parent = parent;
this.operator = operator;
}
在OnSubscribeLift的構(gòu)造函數(shù)中parent 被指向?yàn)镺bservable1中的OnSubscribe(Observable.OnSubscribe<Integer>())
operator指向OperatorMap;
通過Map函數(shù)就創(chuàng)建了一個(gè)新的Observable,所有開頭的例子的代碼就變成了
Observable2 .subscribe(new Subscriber<String>() {
public static final String TAG ="125" ;

@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onNext(String s) {
Log.d(TAG, "onNext: "+s);
}
});
然后在分析下subscribe函數(shù):
public final Subscription subscribe(Subscriber<? super T> subscriber) {
return Observable.subscribe(subscriber, this);
}
在Observable.subscribe(subscriber, this); 中的this 指向的是Observable2;

static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
.................
subscriber.onStart();
hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
return hook.onSubscribeReturn(subscriber);
.................
}
從subscribe函數(shù)代碼可以看出,最終調(diào)用的是onSubscribe的call函數(shù);
此時(shí)的onSubscribe指向的是Observable2.onSubscribe 也就是早lift函數(shù)中創(chuàng)建的OnSubscribeLift;
在OnSubscribeLift.java 代碼中:
public void call(Subscriber<? super R> o) {
.............
Subscriber<? super T> st = hook.onLift(operator).call(o);

st.onStart();
parent.call(st);
............
}
在call函數(shù)中參數(shù) Subscriber<? super R> o指向的是subscribe函數(shù)中的Subscriber<String>();
call函數(shù)的內(nèi)部首先創(chuàng)建了一個(gè)新的 Subscriber<? super T> st;
此時(shí)的operator指向的是OperatorMap類
新的Subcriber(MapSubscriber對(duì)象)放入訂閱列表中,以便最后一起把訂閱對(duì)象釋放。同時(shí)返回新的Subcriber。
public Subscriber<? super T> call(final Subscriber<? super R> o) {
? ?MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
? ?o.add(parent);
? ?return parent;
}
static final class MapSubscriber<T, R> extends Subscriber<T> {
? public MapSubscriber(Subscriber<? super R> actual, Func1<? super T, ? extends R> mapper) {
? ?this.actual = actual;
? ?this.mapper = mapper;
? }
}
在OperatorMap類的call方法中創(chuàng)建了一個(gè)新的MapSubscriber對(duì)象;
在創(chuàng)建的MapSubscriber對(duì)象的構(gòu)造函數(shù)中對(duì)字段進(jìn)行賦值
actual 指向 o 也就是subscribe函數(shù)中的Subscriber<String>();
mapper 指向OperatorMap.transformer (指向了map函數(shù)的中參數(shù)Func1<Integer, String>())

回到在OnSubscribeLift.call 代碼中,當(dāng)創(chuàng)建好新的Subscriber對(duì)象后,將執(zhí)行
parent.call(st);
此時(shí)的parent 指向的是Observable1中的OnSubscribe,因此調(diào)用的call方法相當(dāng)于是
public void call(Subscriber<? super Integer> subscriber) {
? subscriber.onNext(123);
}
此時(shí)的subscriber 就是新建的st(MapSubscriber) 跳轉(zhuǎn)到onNext函數(shù)中;
static final class MapSubscriber<T, R> extends Subscriber<T> {
public void onNext(T t) {
? R result;

? ? try {
? ? ?result = mapper.call(t);
? ?} catch (Throwable ex) {
? ?Exceptions.throwIfFatal(ex);
? ?unsubscribe();
? ?onError(OnErrorThrowable.addValueAsLastCause(ex, t));
? ?return;
? }

? ?actual.onNext(result);
}
}
此時(shí)的參數(shù)t為123;執(zhí)行mapper.call(t);
mapper此時(shí)執(zhí)行的是
public String call(Integer integer) {
return integer.toString();
}
result 就變?yōu)榱?#34;123";
然后在執(zhí)行actual.onNext("123");
actual此時(shí)就是:
public void onNext(String s) {
Log.d(TAG, "onNext: "+s);
}

到現(xiàn)在為止,整個(gè)流程代碼就分析完成了

轉(zhuǎn)載于:https://www.cnblogs.com/h20064528/p/6543071.html

總結(jié)

以上是生活随笔為你收集整理的RxJava 中的Map函数原理分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色小视频免费在线观看 | 91拔萝卜视频 | 免费国产在线观看 | 国产精品白嫩极品美女 | 欧美7777 | 日本超碰 | 国产精品18久久久久久vr下载 | 91青青草 | 香蕉视频在线观看免费 | 日韩女同互慰一区二区 | 国产亚洲精品精品国产亚洲综合 | 日韩中文字幕有码 | 精品香蕉视频 | 五月婷婷六月香 | 欧美日韩一区二区区别是什么 | 日韩短视频 | 欧美成人一区二区在线 | 亚洲色图2| 黑鬼巨鞭白妞冒白浆 | 91超碰在线观看 | 欧美高清在线观看 | 麻豆激情视频 | 极品蜜桃臀肥臀-x88av | 日本涩涩视频 | 波多在线播放 | 金鱼妻日剧免费观看完整版全集 | 视频福利在线 | 精品日韩一区二区 | 69er小视频| 欧美人禽杂交狂配 | 99在线精品免费视频 | 91在线视频在线观看 | 日韩一区二区三区在线观看视频 | 长腿校花无力呻吟娇喘的视频 | 日在线视频 | 国产一区二区三区高清视频 | 国产精品高清在线 | 亚洲性视频网站 | 精品国产乱码久久久久久浪潮 | 一区二区三区网 | 国产少妇自拍 | 成人免费xxxxxx视频 | 国产女主播在线观看 | √天堂资源地址在线官网 | 亚洲日本欧美精品 | 韩国中文三级hd字幕 | 桃色成人 | 一本一道无码中文字幕精品热 | 久久精品电影 | 黄色小视频在线免费观看 | 一区二区欧美视频 | 欧美午夜性春猛交 | 中文字幕av高清 | 一级片在线免费播放 | 国产大屁股喷水视频在线观看 | 开心色站 | 亚洲av永久无码精品三区在线 | 蜜桃久久久久久 | 欧美久久久久久又粗又大 | 不卡av在线播放 | 青娱乐毛片| av观看网站 | 日韩成人激情视频 | 手机在线一区二区 | 在线污视频 | 男人操女人的软件 | 99一区二区| 婷婷国产一区二区三区 | 九九热久久免费视频 | 欧美你懂得 | 在线视频 91 | 99在线免费观看视频 | 久久精精品久久久久噜噜 | 久久久激情| 欧美日韩在线观看视频 | 亚洲综合图 | 成人午夜免费在线 | 美女一二三区 | 尤物视频网站在线观看 | 在线观看国产 | 91精品人妻一区二区三区蜜桃欧美 | 日韩欧美视频一区二区 | 国产精品一区二区黑人巨大 | 久草视频在线免费播放 | 91在线观看免费高清 | 国产免费aa | 国产精品国产三级国产aⅴ下载 | 综合精品久久久 | 开心激情深爱 | 9.1成人看片| 国产精品中文无码 | 亚洲a视频在线 | 久久99精品久久久久婷婷 | 国产成人小视频在线观看 | 在线播放成人av | 阿v免费视频 | 3p视频在线| 海角社区在线视频播放观看 | 肉色欧美久久久久久久免费看 |