翻譯自:https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/transform
Transform
Description
Reactor ships with several operators that can be used to transform data.
Reactor有幾個可用于轉(zhuǎn)換數(shù)據(jù)的運(yùn)算符。
Practice
In the first place, we will capitalize a String
. Since this is a simple 1-1
transformation with no expected latency, we can use the map operator with
a lambda transforming a T into a U.
首先,我們將字符串大寫。由于這是一個簡單的1-1轉(zhuǎn)換,沒有預(yù)期的延遲,我們可以使用map運(yùn)算符和lambda將T轉(zhuǎn)換為U。
// Capitalize the user username, firstname and lastname
Mono<User> capitalizeOne(Mono<User> mono) {
return mono.map(user -> {
return new User(user.getUsername().toUpperCase(), user.getFirstname().toUpperCase(), user.getLastname().toUpperCase());
});
}
We can use exactly the same code on a Flux
, applying the mapping to each
element as it becomes available.
我們可以在Flux上使用完全相同的代碼,在每個元素可用時應(yīng)用映射。
// Capitalize the users username, firstName and lastName
Flux<User> capitalizeMany(Flux<User> flux) {
return flux.map(user -> new User(user.getUsername().toUpperCase(), user.getFirstname().toUpperCase(), user.getLastname().toUpperCase()));
}
Now imagine that we have to call a webservice to capitalize our String.
This new call can have latency so we cannot use the synchronous map
anymore.
Instead, we want to represent the asynchronous call as a Flux
or Mono
,
and use a different operator: flatMap
.
現(xiàn)在想象一下,我們必須調(diào)用一個webservice來大寫字符串。這個新的調(diào)用可能有延遲,
因此我們不能再使用同步map。相反,我們希望Flux或Mono進(jìn)行異步調(diào)用,并使用不同的運(yùn)算符:flatMap。
flatMap
takes a transformation Function
that returns a Publisher<U>
instead of a U
. This publisher represents the asynchronous transformation to
apply to each element. If we were using it with map
, we'd obtain a stream of
Flux<Publisher<U>>
. Not very useful.
flatMap采用一個轉(zhuǎn)換函數(shù),該函數(shù)返回一個Publisher<U>,而不是一個U。該publisher表示應(yīng)用于
每個元素的異步轉(zhuǎn)換。如果我們將其與map一起使用,我們將獲得一個Flux<Publisher<U>>流。不是很有用。
But flatMap
on the other hand knows how to deal with these inner publishers:
it will subscribe to them then merge all of them into a single global output,
a much more useful Flux<U>
. Note that if values from inner publishers arrive
at different times, they can interleave in the resulting Flux
.
但另一方面,flatMap知道如何處理這些內(nèi)部發(fā)布者:它將訂閱這些發(fā)布者,
然后將所有發(fā)布者合并為一個全局輸出,這是一個更有用的Flux<U>。
請注意,如果來自內(nèi)部發(fā)布者的值在不同的時間到達(dá),它們可以交叉插入到產(chǎn)生的Flux中。
// Capitalize the users username, firstName and lastName using #asyncCapitalizeUser
Flux<User> asyncCapitalizeMany(Flux<User> flux) {
return flux.flatMap(user -> Flux.just(new User(user.getUsername().toUpperCase(), user.getFirstname().toUpperCase(), user.getLastname().toUpperCase())));
}