国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - Java反應式框架Reactor中的Mono和Flux

Java反應式框架Reactor中的Mono和Flux

2021-10-21 10:48碼農小胖哥 Java教程

這篇文章主要介紹了Java反應式框架Reactor中的Mono和Flux,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Java反應式框架Reactor中的Mono和Flux

1. 前言

最近寫關于響應式編程的東西有點多,很多同學反映對fluxmono這兩個reactor中的概念有點懵逼。但是目前java響應式編程中我們對這兩個對象的接觸又最多,諸如spring webflux、rsocket、r2dbc。我開始也對這兩個對象頭疼,所以今天我們就簡單來探討一下它們。

2. 響應流的特點

要搞清楚這兩個概念,必須說一下響應流規范。它是響應式編程的基石。他具有以下特點:

響應流必須是無阻塞的。響應流必須是一個數據流。它必須可以異步執行。并且它也應該能夠處理背壓。

背壓是反應流中的一個重要概念,可以理解為,生產者可以感受到消費者反饋的消費壓力,并根據壓力進行動態調整生產速率。形象點可以按照下面理解:

Java反應式框架Reactor中的Mono和Flux

3. publisher

由于響應流的特點,我們不能再返回一個簡單的pojo對象來表示結果了。必須返回一個類似java中的future的概念,在有結果可用時通知消費者進行消費響應。

reactive stream規范中這種被定義為publisher<t>publisher<t>是一個可以提供0-n個序列元素的提供者,并根據其訂閱者subscriber<? super t>的需求推送元素。一個publisher<t>可以支持多個訂閱者,并可以根據訂閱者的邏輯進行推送序列元素。下面這個excel計算就能說明一些publisher<t>的特點。

Java反應式框架Reactor中的Mono和Flux

a1-a9就可以看做publisher<t>及其提供的元素序列。a10-a13分別是求和函數sum(a1:a9)、平均函數average(a1:a9)、最大值函數max(a1:a9)、最小值函數min(a1:a9),可以看作訂閱者subscriber。假如說我們沒有a10-a13,那么a1-a9就沒有實際意義,它們并不產生計算。這也是響應式的一個重要特點:當沒有訂閱時發布者什么也不做。

fluxmono都是publisher<t>在reactor 3實現。publisher<t>提供了subscribe方法,允許消費者在有結果可用時進行消費。如果沒有消費者publisher<t>不會做任何事情,他根據消費情況進行響應。 publisher<t>可能返回零或者多個,甚至可能是無限的,為了更加清晰表示期待的結果就引入了兩個實現模型monoflux

4. flux

flux 是一個發出(emit)0-n個元素組成的異步序列的publisher<t>,可以被oncomplete信號或者onerror信號所終止。在響應流規范中存在三種給下游消費者調用的方法 onnext, oncomplete, 和onerror。下面這張圖表示了flux的抽象模型:

Java反應式框架Reactor中的Mono和Flux

以上的的講解對于初次接觸反應式編程的依然是難以理解的,所以這里有一個循序漸進的理解過程。

有些類比并不是很妥當,但是對于你循序漸進的理解這些新概念還是有幫助的。

傳統數據處理

我們在平常是這么寫的:

?
1
2
3
4
public list<clientuser> allusers() {
    return arrays.aslist(new clientuser("felord.cn", "reactive"),
            new clientuser("felordcn", "reactor"));
}

我們通過迭代返回值listget這些元素進行再處理(消費),這種方式有點類似廚師做了很多菜,吃不吃在于食客。需要食客主動去來吃就行了(pull的方式),至于喜歡吃什么不喜歡吃什么自己隨意,怎么吃也自己隨意。

流式數據處理

在java 8中我們可以改寫為流的表示:

?
1
2
3
4
public stream<clientuser> allusers() {
    return  stream.of(new clientuser("felord.cn", "reactive"),
            new clientuser("felordcn", "reactor"));
}

依然是廚師做了很多菜,但是這種就更加高級了一些,提供了菜品的搭配方式(不包含具體細節),食客可以按照說明根據自己的習慣搭配著去吃,一但開始概不退換,吃完為止,過期不候。

反應式數據處理

在reactor中我們又可以改寫為flux表示:

?
1
2
3
4
public flux<clientuser> allusers(){
    return flux.just(new clientuser("felord.cn", "reactive"),
            new clientuser("felordcn", "reactor"));
}

這時候食客只需要訂餐就行了,做好了自然就呈上來,而且可以隨時根據食客的飯量進行調整。如果沒有食客訂餐那么廚師就什么都不用做。當然不止有這么點特性,不過對于方便我們理解來說這就夠了。

5. mono

mono 是一個發出(emit)0-1個元素的publisher<t>,可以被oncomplete信號或者onerror信號所終止。

Java反應式框架Reactor中的Mono和Flux

這里就不翻譯了,整體和flux差不多,只不過這里只會發出0-1個元素。也就是說不是有就是沒有。象flux一樣,我們來看看mono的演化過程以幫助理解。

傳統數據處理

?
1
2
3
public clientuser currentuser () {
    return isauthenticated ? new clientuser("felord.cn", "reactive") : null;
}

直接返回符合條件的對象或者null

optional的處理方式

?
1
2
3
4
public optional<clientuser> currentuser () {
    return isauthenticated ? optional.of(new clientuser("felord.cn", "reactive"))
            : optional.empty();
}

這個optional我覺得就有反應式的那種味兒了,當然它并不是反應式。當我們不從返回值optional取其中具體的對象時,我們不清楚里面到底有沒有,但是optional是一定客觀存在的,不會出現npe問題。

反應式數據處理

?
1
2
3
4
public mono<clientuser> currentuser () {
    return isauthenticated ? mono.just(new clientuser("felord.cn", "reactive"))
            : mono.empty();
}

optional有點類似的機制,當然mono不是為了解決npe問題的,它是為了處理響應流中單個值(也可能是void)而存在的。

6. 總結

fluxmono是java反應式中的重要概念,但是很多同學包括我在開始都難以理解它們。這其實是規定了兩種流式范式,這種范式讓數據具有一些新的特性,比如基于發布訂閱的事件驅動,異步流、背壓等等。另外數據是推送(push)給消費者的以區別于平時我們的拉(pull)模式。同時我們可以像stream api一樣使用類似mapflatmap等操作符(operator)來操作它們。對fluxmono這兩個概念需要花一些時間去理解它們,不能操之過急。

到此這篇關于java反應式框架reactor中的mono和flux的文章就介紹到這了,更多相關java框架 reactor中的mono和flux內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/felordcn/p/13747262.html

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
1108
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 在线观看成人 | 亚洲第一成av人网站懂色 | 国产精品视频在线播放 | 在线视频一区二区三区 | 草久久久| 久久国 | 亚洲成人自拍 | 中文字幕一区二区三区日韩精品 | 蜜桃传媒一区二区 | 久久久成人动漫 | 亚洲青草 | 成人精品福利 | 黄视频在线免费看 | 精品一区二区三区中文字幕 | 国产精品久久久久一区二区三区 | 亚洲国产精品一区 | 国产精品亚洲一区二区三区 | 亚洲国产高清高潮精品美女 | 这里只有久久精品 | 青青草亚洲 | 成人免费视频008 | 九九热这里 | 精品无码久久久久久久动漫 | 天天操天天插 | 国产成人精品在线 | 欧美日一区二区 | 成人一区二区三区 | av在线精品| 免费a级毛片在线看 | 久久综合久久综合久久综合 | 中国大陆高清aⅴ毛片 | 欧美日韩中文在线 | 亚洲视频在线观看 | 国产免费自拍 | 欧美三级在线 | 超级碰在线视频 | 国产综合视频在线观看 | 亚洲精品一区二区三区蜜桃久 | 欧美国产精品一区二区三区 | 亚洲国产精品一区二区久久 | 欧美视频二区 |