Reactive - 10 - Other Operations

翻译自:https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/OthersOperations

Other Operations


Description


In this section, we'll have a look at a few more useful operators that don't
fall into the broad categories we explored earlier. Reactor 3 contains a lot
of operators, so don't hesitate to have a look at the
Flux
and Mono
javadocs as well as the reference guide
to learn about more of them.

在本节中,我们将了解一些更有用的运算符,这些运算符不属于我们前面探讨的大类别。
Reactor 3包含很多运算符,所以请毫不犹豫地查看Flux和Mono javadocs以及参考指南,以了解更多。

Practice


In the first exercise we'll receive 3 Flux<String>. Their elements could
arrive with latency, yet each time the three sequences have all emitted
an element, we want to combine these 3 elements and create a new User.
This concatenate-and-transform operation is called zip:

在第一个练习中,我们将收到3个Flux<String>。它们的元素可能会延迟到达,但每次这三个序列
都发出一个元素,我们希望将这三个元素结合起来,创建一个新用户。这种连接和转换操作称为zip:
    // Create a Flux of user from Flux of username, firstname and lastname.
    Flux<User> userFluxFromStringFlux(Flux<String> usernameFlux, Flux<String> firstnameFlux, Flux<String> lastnameFlux) {
        return Flux.zip(usernameFlux, firstnameFlux, lastnameFlux).map(tuples->new User(tuples.getT1(), tuples.getT2(), tuples.getT3()));
    }

If you have 3 possible Mono sources and you only want to keep the one that
emits its value the fastest, you can use the firstWithValue static method:

如果您有3个可能的Mono源,并且只想保持发射其值最快的一个,那么可以使用firstWithValue静态方法:
    // Return the mono which returns its value faster
    Mono<User> useFastestMono(Mono<User> mono1, Mono<User> mono2) {
        return Mono.firstWithValue(mono1, mono2);
    }

Flux also has the firstWithValue static method. Only the first element
emitted by each Flux is considered to select the fastest Flux (which is
then mirrored in the output):

Flux也有firstWithValue静态方法。只考虑每个通量发射的第一个元素来选择最快的通量(然后在输出中镜像):
    // Return the flux which returns the first value faster
    Flux<User> useFastestFlux(Flux<User> flux1, Flux<User> flux2) {
        return Flux.firstWithValue(flux1, flux2);
    }

Sometimes you're not interested in elements of a Flux<T>. If you want to
still keep a Flux<T> type, you can use ignoreElements(). But if you really
just want the completion, represented as a Mono<Void>, you can use then() instead:

有时你对Flux<T>的元素不感兴趣。如果仍要保持Flux<T>类型,可以使用ignoreElements()。
但是,如果您真的只想完成,用Mono<Void>表示,您可以使用then():
    // Convert the input Flux<User> to a Mono<Void> that represents the complete signal of the flux
    Mono<Void> fluxCompletion(Flux<User> flux) {
        return flux.then();
    }

Reactive Streams does not allow null values in onNext. There's an operator
that allow to just emit one value, unless it is null in which case it will
revert to an empty Mono. Can you find it?

反应流不允许onNext中出现空值。有一个运算符只允许发出一个值,除非它为null,在这种情况下,
它将恢复为空的Mono。你能找到它吗?
    // Return a valid Mono of user for null input and non null input user (hint: Reactive Streams do not accept null values)
    Mono<User> nullAwareUserToMono(User user) {
        return Mono.justOrEmpty(user);
    }

Similarly, if you want to prevent the empty Mono case by falling back to a
different one, you can find an operator that does this switch:

类似地,如果您想通过返回另一个Mono来防止出现空Mono情况,您可以找到一个执行此switch的运算符:
    // Return the same mono passed as input parameter, expect that it will emit User.SKYLER when empty
    Mono<User> emptyToSkyler(Mono<User> mono) {
        //这两个api都可以实现
        return mono.defaultIfEmpty(User.SKYLER);
        //return mono.switchIfEmpty(Mono.just(User.SKYLER));
    }

Sometimes you want to capture all values emitted by Flux into separate List.
In this case you can use collectList operator that would return Mono
containing that List.

有时,您希望将Flux发出的所有值捕获到单独的List中。在这种情况下,
您可以使用collectList运算符返回包含该List的Mono。
    // Convert the input Flux<User> to a Mono<List<User>> containing list of collected flux values
    Mono<List<User>> fluxCollection(Flux<User> flux) {
        return flux.collectList();
    }

There are more operators belonging to the collect family. You can check them
out in Flux documentation.

有更多的运算符属于collect系列。您可以在Flux文档中查看它们。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容