翻譯ReactiveX操作符(一)

官方文檔鏈接:http://reactivex.io/documentation/operators.html

1.前言


每種實(shí)現(xiàn)了ReactiveX的語言都有一套操作符,并且命名上趨向于該語言下那些已經(jīng)熟悉的、功能類似的方法概荷。雖然這些實(shí)現(xiàn)之間有許多相同的部分式曲,但也有些操作符只在特定語言中存在。

2.操作鏈


大多數(shù)操作符作用于被觀察者,并返回被觀察者。這就允許操作符如鏈條一樣,一個(gè)接著一個(gè)瞻离,導(dǎo)致每個(gè)操作符可以修改上一個(gè)操作符處理后的被觀察者(操作鏈不直接作用于鏈最開始的那個(gè)被觀察者,而是依次執(zhí)行乒裆,每個(gè)操作符作用的被觀察者由緊挨著它的上一個(gè)操作符生成)套利。

還有其它模式允許以相似的方式鏈接方法,比如建造者模式缸兔,指定類有一系列方法可以對自己操作日裙,通過調(diào)用這些方法修改類的實(shí)例。但對它而言惰蜜,方法在鏈中出現(xiàn)的順序通常不重要昂拂,而被觀察者的操作符則關(guān)注順序。

3.創(chuàng)建被觀察者


產(chǎn)生新的被觀察者的操作符抛猖。

  • Empty / Never / Throw — 創(chuàng)建有非常明確和限制性行為的被觀察者格侯。

    Empty / Never / Throw.png

    empty()never()throw()操作符對測試有幫助财著,有時(shí)也結(jié)合其它被觀察者或作為操作符的參數(shù)联四。

    參考這篇文章 Introduction to Rx: Simple Factory Methods

  • Create — 通過程序地調(diào)用觀察者的方法,從頭創(chuàng)建一個(gè)被觀察者撑教。

    Create.png

    create()操作符從頭創(chuàng)建一個(gè)被觀察者朝墩。給這個(gè)操作符傳入支持觀察者的函數(shù)(這是函數(shù)式編程的概念,可以理解為匿名內(nèi)部類)作為參數(shù)伟姐,并將函數(shù)的行為當(dāng)作被觀察的目標(biāo)收苏,比如適當(dāng)?shù)卣{(diào)用觀察者的onNext()onError()onCompleted()方法愤兵。一個(gè)良好定義的被觀察者必須嘗試調(diào)用觀察者的onCompleted()方法一次或它的onError()方法一次鹿霸,此后不再嘗試調(diào)用觀察者的任何其它方法。

    參考的文章:

  • Defer — 直到觀察者訂閱后才創(chuàng)建被觀察者秆乳,并且為每個(gè)觀察者創(chuàng)建新的被觀察者懦鼠。

    Defer.png

    defer()操作符直到觀察者訂閱了它钻哩,才根據(jù)被觀察者工廠函數(shù)生成被觀察者。為每個(gè)訂閱者重復(fù)以上步驟肛冶,盡管它們可能會認(rèn)為自己訂閱的是同一個(gè)被觀察者(實(shí)際上每個(gè)訂閱者獲得了專屬自己的事件隊(duì)列)街氢。某些情況下,等到最后時(shí)刻(指訂閱的時(shí)刻)生成被觀察者能保證它包含最新的數(shù)據(jù)睦袖。

    參考這篇文章 Deferring Observable code until subscription in RxJava by Dan Lew

  • Start — 創(chuàng)建一個(gè)被觀察者阳仔,將一個(gè)函數(shù)的返回值作為事件產(chǎn)生。

    Start.png

    編程語言有許多方式獲取計(jì)算結(jié)果的值扣泊,它們被稱為functions、futures嘶摊、actions延蟹、callables、runnables叶堆,等阱飘。集聚在start()操作符類別下的這些操作行為與被觀察者類似,可以與其它被觀察者結(jié)合使用虱颗。

    參考的文章:

  • From — 將各種其它對象或數(shù)據(jù)結(jié)構(gòu)(含有多個(gè)元素)轉(zhuǎn)變?yōu)橐粋€(gè)被觀察者(每個(gè)元素都是一個(gè)事件)沥匈。

    From.png

    from()操作符可以很方便地將需要處理的所有數(shù)據(jù)表現(xiàn)為被觀察者,而不是混雜著被觀察者和其它類型忘渔。這允許使用一套操作符來管理數(shù)據(jù)流的整個(gè)有效期高帖。Iterables,可以被認(rèn)為是一種同步執(zhí)行的被觀察者畦粮;Futures(Java中指異步執(zhí)行)散址,則認(rèn)為是一種只產(chǎn)生單一事件的被觀察者。通過將這些對象顯式轉(zhuǎn)換成被觀察者宣赔,允許它們像普通被觀察者一樣調(diào)用预麸。出于這個(gè)原因,大多數(shù)ReactiveX的實(shí)現(xiàn)都有方法將某一特定語言對象和數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成被觀察者儒将。

    參考的文章:

  • Just — 將一個(gè)或一系列對象轉(zhuǎn)換成一個(gè)產(chǎn)生一個(gè)或多個(gè)事件的被觀察者吏祸。

    Just.png

    just()操作符和from()操作符類似。但得注意钩蚊,前者將數(shù)組贡翘、迭代器等簡單地當(dāng)作一個(gè)事件產(chǎn)生,不做改變两疚;而后者將這些類型拆成單獨(dú)的事件產(chǎn)生床估。注意,如果給just()操作符傳null诱渤,將返回產(chǎn)生事件為null的被觀察者丐巫。不要犯這種錯(cuò)誤,因?yàn)闀祷匾粋€(gè)空的被觀察者(不產(chǎn)生任何事件)。若需要這種情況递胧,建議使用empty()操作符碑韵。

    參考的文章:

  • Repeat — 創(chuàng)建一個(gè)被觀察者,重復(fù)地產(chǎn)生某特定的事件或事件隊(duì)列缎脾。

    Repeat.png

    repeat()操作符重復(fù)地產(chǎn)生一個(gè)事件祝闻,別的實(shí)現(xiàn)允許重復(fù)產(chǎn)生事件隊(duì)列或設(shè)置重復(fù)的次數(shù)。

    參考的文章:

  • Timer — 創(chuàng)建一個(gè)被觀察者遗菠,在給定的延遲后產(chǎn)生一個(gè)特定的事件联喘。

    Timer.png

    參考的文章:

  • Interval — 創(chuàng)建一個(gè)被觀察者,每隔指定時(shí)間產(chǎn)生一個(gè)整數(shù)辙纬。

    Interval.png

    interval()操作符返回一個(gè)被觀察者豁遭,它產(chǎn)生一個(gè)遞增的整數(shù)的無窮序列,并且元素間保持著固定的時(shí)間間隔贺拣。

    參考的文章:

  • Range — 創(chuàng)建一個(gè)產(chǎn)生特定范圍內(nèi)若干連續(xù)整數(shù)的被觀察者蓖谢。

    Range.png

    range()操作符根據(jù)確定的開始位置和范圍長度,按順序產(chǎn)生一系列整數(shù)譬涡。

    參考的文章:

4.改變被觀察者


改變被觀察者產(chǎn)生的事件的操作符闪幽。由于以后講的操作符不處于操作鏈?zhǔn)撞浚阅J(rèn)為傳遞事件涡匀,實(shí)際上是內(nèi)部創(chuàng)建的被觀察者產(chǎn)生事件盯腌。同時(shí),約定操作符之前的被觀察者稱為原始被觀察者陨瘩,它產(chǎn)生的事件為原始事件腊嗡。

  • Buffer — 定期收集被觀察者的事件,每次傳遞事件的集合而不是單個(gè)事件拾酝。

    Buffer.png

    buffer()操作符將每次產(chǎn)生單個(gè)事件的被觀察者改變?yōu)槊看蝹鬟f緩沖的事件集合的被觀察者燕少。它在不同的特定語言實(shí)現(xiàn)中是不一樣的,區(qū)別在于如何選擇哪個(gè)事件進(jìn)哪個(gè)緩存區(qū)蒿囤。需注意的是客们,如果原始被觀察者發(fā)布一個(gè)onError()通知,buffer()操作符將立即傳遞這個(gè)通知材诽。不管準(zhǔn)備傳遞的集合是處于收集的過程中底挫,還是在通知發(fā)布之前已經(jīng)收集好了。

    參考的文章:

  • Window — 定期劃分被觀察者的事件到不同的視窗脸侥,每次傳遞這些視窗而不是單個(gè)事件建邓。

    Window.png

    window()操作符和buffer()操作符類似。但相較于后者通過數(shù)據(jù)結(jié)構(gòu)容納事件并傳遞睁枕;前者則是新建被觀察者官边,每一個(gè)都傳遞原始事件的子集沸手,并由一個(gè)onCompleted()通知終止。

    buffer()操作符一樣注簿,window()操作符有許多種實(shí)現(xiàn)契吉,每種都用自己的方式將原始被觀察者劃分為多個(gè)被觀察者,它們將分別包含的原始事件統(tǒng)稱視窗诡渴。在window()操作符的術(shù)語中捐晶,當(dāng)一個(gè)視窗打開,意味著一個(gè)新的被觀察者將開始傳遞原始事件妄辩;當(dāng)那個(gè)視窗關(guān)閉惑灵,意味著那個(gè)被觀察者停止傳遞原始事件,并給自己的觀察者發(fā)送一個(gè)onCompleted()通知來終止眼耀。

    參考的文章:

  • GroupBy — 將一個(gè)被觀察者劃分成一系列被觀察者泣棋,其中每個(gè)被觀察者傳遞按鍵值區(qū)分的不同的原始事件的子集。

    GroupBy.png

    groupBy()操作符將一個(gè)產(chǎn)生事件的被觀察者劃分成多個(gè)畔塔,每個(gè)僅傳遞原始事件的子集。哪些事件最終屬于哪個(gè)被觀察者鸯屿,通常由一個(gè)判別函數(shù)(評估每個(gè)事件并指派它鍵值)決定澈吨。所有擁有相同鍵值的事件需同一個(gè)被觀察者傳遞。

    參考的文章:

  • Map — 通過使用一個(gè)函數(shù)來改變被觀察者產(chǎn)生的事件寄摆。

    Map.png

    map()操作符對每個(gè)原始事件使用指定的函數(shù)谅辣,并且返回一個(gè)用這些函數(shù)結(jié)果產(chǎn)生事件的被觀察者。

    參考的文章:

  • FlatMap — 將被觀察者產(chǎn)生的每個(gè)事件轉(zhuǎn)換成被觀察者婶恼,然后將它們產(chǎn)生的所有事件由統(tǒng)一的被觀察者傳遞桑阶。

    FlatMap.png

    flatmap()操作符使用一個(gè)指定的函數(shù)來處理每個(gè)原始事件,從而改變被觀察者勾邦。與map()操作符不同的是蚣录,它的函數(shù)返回一個(gè)自己能夠產(chǎn)生事件的被觀察者。然后眷篇,該操作符混合所有后生成的被觀察者產(chǎn)生的事件萎河,作為自己的事件隊(duì)列傳遞出去。

    這個(gè)方法是有用的蕉饼,例如虐杯,當(dāng)一個(gè)被觀察者產(chǎn)生一系列事件,這些事件本身擁有被觀察者成員通過其它方式轉(zhuǎn)變成被觀察者昧港,所以會創(chuàng)建新的被觀察者來傳遞它們產(chǎn)生的所有事件的集合擎椰。需注意的是,flatmap()操作符混合了那些被觀察者的事件创肥,所以事件在順序上可能會交錯(cuò)达舒。

    在幾個(gè)特定語言的實(shí)現(xiàn)中值朋,擁有不會導(dǎo)致交錯(cuò)問題的操作符,而是按照嚴(yán)格的順序傳遞這些事件休弃,通常稱為concatMap()之類的吞歼。

    參考的文章:

  • Scan — 給被觀察者產(chǎn)生的每個(gè)事件應(yīng)用函數(shù),處理時(shí)可使用前一個(gè)值作為參數(shù)塔猾。

    Scan.png

    scan()操作符使用函數(shù)處理第一個(gè)原始事件篙骡,然后將函數(shù)的結(jié)果作為自己的第一個(gè)事件傳遞出去。同時(shí)也將函數(shù)的結(jié)果反饋給函數(shù)處理中的第二個(gè)原始事件丈甸,從而生成自己的第二個(gè)事件糯俗,并依此規(guī)則創(chuàng)建自己剩余的事件隊(duì)列。在其它上下文中睦擂,這種操作符有時(shí)被稱為累加器得湘。

    參考的文章:

5.過濾被觀察者


選擇性地傳遞原始事件的操作符

6.合并被觀察者


通過多個(gè)原始被觀察者創(chuàng)建單一的被觀察者的操作符洗贰。

  • And / Then / When — 通過Pattern和Plan的轉(zhuǎn)換找岖,合并兩個(gè)或多個(gè)被觀察者產(chǎn)生的事件集合。

    And / Then / When.png

    and()敛滋、then()when()操作符合并的行為非常類似于zip()操作符许布,但它們是通過中間層的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。首先接收兩個(gè)或多個(gè)被觀察者绎晃,每次分別取出一個(gè)事件組成集合放入Pattern對象蜜唾。接著將這些Pattern對象分別轉(zhuǎn)換成Plan對象,再依次將各種Plan對象轉(zhuǎn)換成被觀察者的事件庶艾。

    參考的文章:

  • Zip — 通過指定的函數(shù)將多個(gè)被觀察者的事件合并在一起袁余,并把結(jié)果作為每種組合的單一事件產(chǎn)生。

    Zip.png

    zip()操作符返回一個(gè)被觀察者咱揍,它是由指定的函數(shù)依次合并兩個(gè)或多個(gè)其它被觀察者產(chǎn)生的事件颖榜,并將結(jié)果作為自己產(chǎn)生的事件。函數(shù)的使用有嚴(yán)格的順序煤裙,新的被觀察者產(chǎn)生的第一個(gè)事件是函數(shù)將作用的被觀察者產(chǎn)生的第一個(gè)事件合并的結(jié)果掩完,其它以此類推,并且產(chǎn)生事件的數(shù)量由原始事件中最少的那列決定硼砰。

    參考的文章:

  • CombineLatest — 當(dāng)兩個(gè)被觀察者中任一個(gè)產(chǎn)生一個(gè)事件且蓬,通過指定函數(shù)合并每個(gè)被觀察者產(chǎn)生的最新事件,并將結(jié)果作為事件產(chǎn)生题翰。

    CombineLatest.png

    combineLatest()操作符的行為與zip()操作符相似恶阴。除了后者要求每個(gè)需要壓縮的原始被觀察者產(chǎn)生的事件沒被壓縮過;前者則不管這些豹障,只要每個(gè)原始被觀察者產(chǎn)生至少一個(gè)事件冯事。當(dāng)任一個(gè)原始被觀察者產(chǎn)生一個(gè)事件,前者使用提供的函數(shù)合并其它原始被觀察者最近產(chǎn)生的事件血公,并將返回值作為事件產(chǎn)生桅咆。

    參考的文章:

  • Join — 在被觀察者產(chǎn)生的一個(gè)事件的時(shí)間窗內(nèi),其它被觀察者也產(chǎn)生了事件坞笙,則合并兩個(gè)被觀察者相應(yīng)的事件岩饼。

    Join.png

    join()操作符合并兩個(gè)被觀察者產(chǎn)生的事件荚虚,并根據(jù)已經(jīng)定義的事件的時(shí)間窗決定哪些需要合并。當(dāng)這樣一個(gè)定義了時(shí)間窗的被觀察者產(chǎn)生新事件或onCompleted()通知時(shí)籍茧,之前的時(shí)間窗將關(guān)閉版述。只要一個(gè)事件的時(shí)間窗是開啟的,它將合并其它被觀察者產(chǎn)生的任一事件寞冯。還需定義事件合并的函數(shù)渴析。

    GroupJoin.png

    大多數(shù)ReactiveX的實(shí)現(xiàn)中,不僅有join()操作符還有相似的groupJoin()操作符吮龄。除了定義用來合并兩個(gè)被觀察者產(chǎn)生的事件的函數(shù)有所改變俭茧,即后一個(gè)參數(shù)由第二個(gè)被觀察者的符合條件的事件替換為產(chǎn)生相應(yīng)符合事件的被觀察者(可以將前一個(gè)參數(shù)理解為鍵,后一個(gè)參數(shù)理解為對應(yīng)的所有的值)漓帚。

    參考的文章:

  • Merge — 通過直接合并事件來合并多個(gè)被觀察者母债。

    Merge.png

    merge()操作符能夠合并多個(gè)被觀察者的事件,使它們看起來像單一被觀察者尝抖。它可能會交錯(cuò)合并的被觀察者產(chǎn)生的事件(一個(gè)類似的操作符concat()毡们,則沒有這個(gè)問題,在下個(gè)原始被觀察者開始產(chǎn)生事件之前會依次傳遞當(dāng)前的被觀察者的事件)昧辽。

    如上圖所示衙熔,任一個(gè)原始被觀察者發(fā)出onError()通知,將會立即傳遞給觀察者搅荞,并且會終止合并的被觀察者红氯。

    MergeDelayError

    在許多ReactiveX的實(shí)現(xiàn)中,還有一個(gè)操作符mergeDelayError()咕痛,改變了這種行為——推遲onError()通知直到所有合并的被觀察者完成才傳給觀察者痢甘。

    參考的文章:

  • StartWith — 在開始傳遞原始事件之前,傳遞指定的事件隊(duì)列暇检。

    StartWith.png

    如果想要被觀察者在開始傳遞期望的事件之前产阱,傳遞指定的事件隊(duì)列婉称,可以使用startWith()操作符块仆。(相反,如果想要在被觀察者傳遞期望的事件之后添加事件隊(duì)列王暗,可以使用concat()操作符悔据。)

    參考的文章:

  • Switch — 將一個(gè)以被觀察者為事件的被觀察者轉(zhuǎn)換為單一被觀察者,若那些事件級被觀察者同時(shí)間段內(nèi)產(chǎn)生了事件俗壹,取最近的被觀察者的事件作為自己事件產(chǎn)生科汗。

    Switch.png

    switch()操作符關(guān)注的是以被觀察者為事件的被觀察者。每次它只面對這些事件級被觀察者中的一個(gè)绷雏,并在最新的被觀察者開始產(chǎn)生事件時(shí)头滔,轉(zhuǎn)而傳遞這些新事件怖亭。注意,前一個(gè)被觀察者在后一個(gè)被觀察者開始產(chǎn)生事件之后(包括僅是被訂閱還未發(fā)送事件)產(chǎn)生的事件將丟棄(如上圖中的黃色圓圈)坤检。

    參考的文章:

7.錯(cuò)誤處理操作符


幫助從被觀察者的onError()通知中恢復(fù)的操作符兴猩。

  • Catch — 通過攔截隊(duì)列中的一個(gè)onError()通知,來保證繼續(xù)執(zhí)行早歇。

    Catch.png

    catch()操作符攔截原始被觀察者產(chǎn)生的一個(gè)onError()通知倾芝,而不是將它傳遞給任一觀察者,同時(shí)可以用一些其它事件或事件隊(duì)列替換箭跳,還可以允許被觀察者正常終止或根本不終止晨另。還有幾種catch()操作符,以及在不同的ReactiveX實(shí)現(xiàn)中用不同的名字描述這個(gè)操作谱姓,正如下面部分看到的借尿。

    在一些ReactiveX實(shí)現(xiàn)中,有一個(gè)操作符叫什么onErrorResumeNext()逝段,行為類似catch()操作符:對原始被觀察者產(chǎn)生的一個(gè)onError()通知有特定反應(yīng)垛玻。還有一個(gè)同樣名字的操作符,行為更像concat()操作符:不管原始被觀察者是正常終止還是錯(cuò)誤終止奶躯,執(zhí)行連接操作帚桩。

    參考的文章:

  • Retry — 如果原始被觀察者發(fā)送一個(gè)onError()通知,將重新訂閱以期望下次沒有錯(cuò)誤地完成嘹黔。

    Retry.png

    retry()操作符通過不傳遞onError()通知給觀察者账嚎,來響應(yīng)原始被觀察者發(fā)生的錯(cuò)誤,并重新訂閱它儡蔓,獲得另一次無錯(cuò)誤地完成自己的事件隊(duì)列的機(jī)會郭蕉。這個(gè)操作符先傳遞onNext()通知給自己的觀察者,即使隊(duì)列是因?yàn)殄e(cuò)誤而終止的喂江,所以會導(dǎo)致重復(fù)的事件(如上圖所示)召锈。

    參考的文章:

8.總結(jié)


到目前為止,已經(jīng)介紹了ReactiveX一半的操作符获询,而這些操作符恰恰也是最常用的涨岁。ReactiveX可以理解為設(shè)計(jì)模式,講的是一種思路吉嚣,具體每種語言的實(shí)現(xiàn)是不同的梢薪。對于Android開發(fā)的同學(xué),肯定希望使用RxJava尝哆,這里推薦幾篇我認(rèn)為比較全的文章秉撇,以供參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子琐馆,更是在濱河造成了極大的恐慌规阀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘦麸,死亡現(xiàn)場離奇詭異姥敛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瞎暑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門彤敛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人了赌,你說我怎么就攤上這事墨榄。” “怎么了勿她?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵袄秩,是天一觀的道長。 經(jīng)常有香客問我逢并,道長之剧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上宫纬,老公的妹妹穿的比我還像新娘。我一直安慰自己蟹肘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布俯树。 她就那樣靜靜地躺著帘腹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪许饿。 梳的紋絲不亂的頭發(fā)上阳欲,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音陋率,去河邊找鬼球化。 笑死,一個(gè)胖子當(dāng)著我的面吹牛翘贮,可吹牛的內(nèi)容都是我干的赊窥。 我是一名探鬼主播爆惧,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狸页,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芍耘,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤址遇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后斋竞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倔约,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年坝初,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浸剩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鳄袍,死狀恐怖绢要,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拗小,我是刑警寧澤重罪,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站哀九,受9級特大地震影響剿配,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阅束,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一呼胚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧息裸,春花似錦砸讳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宿亡,卻和暖如春常遂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挽荠。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工克胳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人圈匆。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓漠另,卻偏偏與公主長得像,于是被迫代替她去往敵國和親跃赚。 傳聞我的和親對象是個(gè)殘疾皇子笆搓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355