Reactive Streams 與 Java 8 Stream 有什么區(qū)別

之前曾寫過一篇介紹 Spring 提出的 Reactive Streams 實現(xiàn)方案 —— Project Reactor 的文章:《Reactor 入門與實踐》,其中介紹了 Spring Reactor API 的用法。相信很多人都能發(fā)現(xiàn),Spring Reactor 的 API 看上去和 Java 8 Stream 很像:

Project Reactor:

Flux.fromIterable(Character.captainAmerica3())
        .filter(Character::isPlay)
        .map(Character::getName)
        .subscribe(System.out::println);

Java 8 Stream:

Character.captainAmerica3().stream()
        .filter(Character::isPlay)
        .map(Character::getName)
        .forEach(System.out::println);

上面兩段代碼分別由 Spring Reactor 和 Java 8 Stream 實現(xiàn),功能是打印《美隊3》參演的角色名稱秕铛。代碼的形式和大部分方法名稱都是相同的棒假。

那 Spring Reactor 或者說 Reactive Streams 和 Java 8 Stream 的差別是什么呢条辟?

簡單來說,這兩者最大的差別是前者是 Push-based胳施,后者是 Pull-based溯祸。

Push 與 Pull

Reactive Streams 與 Java 8 Stream 最大的不同在于,前者是 Push 模式舞肆,后者是 Pull 模式焦辅。可能大部分人對推與拉的概念不是很了解胆绊。先做一個形象的介紹,常見的操作集合類的方式就是 Pull 模式:

List<User> users = userRpcClient.findAllUsers();
for (String user : users) {
    // do something
}

為什么說這樣的代碼是 Pull 模式呢欧募?因為這樣的代碼压状,客戶端主動向服務端請求數(shù)據(jù),然后在操作數(shù)據(jù)跟继。好比客戶端主動從服務端拉取數(shù)據(jù)种冬,故稱為拉模式。

那 Push 模式是什么樣呢舔糖?

userRpcPublisher.subscribe(new UserSubscriber() {
    public void onNext(User user) {
        // do something
    }
});

簡單來說就是 Callback 風格的代碼通常都是 Push 模式的娱两。

Pull 模式的代碼的問題在于,如果 userRpcClient.findAllUsers() 表示的操作是一個很耗時的操作金吗,那 Pull-based 的代碼的并發(fā)能力將很成問題十兢。這就是 Push 模式出現(xiàn)的原因。

當然摇庙,上面兩個例子只是為了給大家一個直觀的介紹旱物。并不是說傳統(tǒng)形式的代碼就一定是 Pull 模式,Callback 風格的代碼就一定是 Pull 模式卫袒。

換言之宵呛,代碼形式并不是 Pull 與 Push 的本質(zhì)。從更深的層面說夕凝,Pull 模式對應的是同步的宝穗、命令式的程序,Push 模式對應的是異步的码秉、非阻塞的逮矛、反應式的程序。

因此转砖,雖然在代碼形式上說 Java 8 Stream 和 Reactive Streams 的代碼有些像橱鹏,但從本質(zhì)上來說,同步、阻塞的 Java 8 Stream 與異步莉兰、非阻塞的 Reactive Streams 有著很大的差別挑围。

因此 Reactive Streams 不僅在形的層面,以接口定義的形式對反應式編程做出了規(guī)范糖荒,更在實的層面定義了 TCK杉辙,用來保證相關實現(xiàn)確實滿足了異步、非阻塞等等的要求捶朵。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜘矢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子综看,更是在濱河造成了極大的恐慌品腹,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件红碑,死亡現(xiàn)場離奇詭異舞吭,居然都是意外死亡,警方通過查閱死者的電腦和手機析珊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門羡鸥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忠寻,你說我怎么就攤上這事惧浴。” “怎么了奕剃?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵衷旅,是天一觀的道長。 經(jīng)常有香客問我纵朋,道長芜茵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任倡蝙,我火速辦了婚禮九串,結果婚禮上,老公的妹妹穿的比我還像新娘寺鸥。我一直安慰自己猪钮,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布胆建。 她就那樣靜靜地躺著烤低,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笆载。 梳的紋絲不亂的頭發(fā)上扑馁,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天涯呻,我揣著相機與錄音,去河邊找鬼腻要。 笑死复罐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的雄家。 我是一名探鬼主播效诅,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼趟济!你這毒婦竟也來了乱投?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤顷编,失蹤者是張志新(化名)和其女友劉穎戚炫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媳纬,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡双肤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了层宫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杨伙。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡其监,死狀恐怖萌腿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抖苦,我是刑警寧澤毁菱,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站锌历,受9級特大地震影響贮庞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜究西,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一窗慎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卤材,春花似錦遮斥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帆精,卻和暖如春较屿,著一層夾襖步出監(jiān)牢的瞬間隧魄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工隘蝎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留购啄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓末贾,卻偏偏與公主長得像闸溃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拱撵,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理辉川,服務發(fā)現(xiàn),斷路器拴测,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 適合閱讀的人群:本文適合對 Spring乓旗、Netty 等框架,以及 Java 8 的 Lambda集索、Stream ...
    編走編想閱讀 50,613評論 39 116
  • 人生的意義到底是什么屿愚?活了25年,這個哲學問題依然困擾著我务荆,有時坐在那里可以想半天而無確切答案妆距。相對于年長的前輩們...
    安小默閱讀 300評論 0 0
  • 一個人的好天氣 巧克力醬 臺風后的天氣還蠻討喜的,空氣...
    chocolate瑩子閱讀 247評論 0 1
  • 如魚得水于杰閱讀 205評論 0 0