日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 好色婷婷 | 色偷偷在线观看 | 久久精国产 | 欧美大片视频在线观看 | 精品少妇久久久 | 日韩精品在线免费 | 午夜影院免费在线观看 | 男女日屁视频 | 国产一区第一页 | 欧美一级视频免费观看 | 欧美三级成人 | 日韩不卡一区二区 | 国产波霸爆乳一区二区 | 国产精品21p| 亚洲综合第一页 | av无码精品一区二区三区 | 日韩成人久久 | 久久国产欧美日韩精品 | 国产午夜成人久久无码一区二区 | 午夜aaa片一区二区专区 | 免费一区二区视频 | 国产成人在线播放视频 | 日韩成人免费在线视频 | 青青青免费视频观看在线 | 日本人妻一区二区三区 | 久久久91精品国产一区二区三区 | 色在线免费| 日韩夜夜高潮夜夜爽无码 | 久久99精品久久久久久琪琪 | 玖玖玖在线观看 | 大黑人交xxx极品hd | 国产青青 | wwww黄色片 | 特级西西www444人体聚色 | 欧美经典一区二区 | 色av网| 国产无遮挡免费观看视频网站 | 日本美女操 | 精品久久久久久久久久久久久久 | 69国产在线 | 午夜久久久久久久久久 | 特黄一级毛片 | 老妇free性videosxx | 伊人久久青青 | 天天干天天干天天干 | 91视频地址 | 99re99| 91久久国语露脸精品国产高跟 | 亚洲性自拍 | 嫩草影院av | 成人动漫一区二区 | 精品国产免费av | 欧洲金发美女大战黑人 | 欧美国产一二三区 | 亚洲AV无码成人精品区麻豆 | 国产高清视频在线播放 | 色偷偷人人澡人人爽人人模 | 91精品婷婷国产综合久久蝌蚪 | 日日碰日日摸 | 手机在线一区二区 | 日韩最新网址 | 台湾佬成人中文网222vvv | 中文字幕看片 | 四虎4hu| 久久久视频在线观看 | 最近中文字幕在线视频 | 护士人妻hd中文字幕 | 欧美激情一区二区在线 | 亚洲一区二区三区精品视频 | h片网站在线观看 | 97在线播放| 欧美性高潮视频 | 亚洲欧美中日韩 | 国产www在线观看 | 天堂最新资源在线 | 九九热视频在线播放 | 亚洲精品v天堂中文字幕 | 少妇久久久久久被弄高潮 | 国产一区二区网 | 99在线观看免费视频 | 欧美精品一区二区性色a+v | 国产美女精品久久久 | 日本一区二区三区网站 | 日本性生活一级片 | jjzz黄色片 | 三级视频在线 | 欧美色视频在线观看 | 91香蕉黄 | 无码人妻精品一区二区蜜桃网站 | 国产精品xxxxx | 一区二区三区伦理片 | 日韩精品一区二区三区国语自制 | 三年在线观看视频 | 久久这里只有精品首页 | 内射一区二区 | 99国产成人精品 | 邻居少妇张开腿让我爽了在线观看 | 欧美一区二区三区免 | 波多野结衣在线观看一区 |