Reactive - 05 - Transform

翻譯自: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有幾個可用于轉換數據的運算符。

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轉換,沒有預期的延遲,我們可以使用map運算符和lambda將T轉換為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上使用完全相同的代碼,在每個元素可用時應用映射。
    // 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.

現在想象一下,我們必須調用一個webservice來大寫字符串。這個新的調用可能有延遲,
因此我們不能再使用同步map。相反,我們希望Flux或Mono進行異步調用,并使用不同的運算符: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采用一個轉換函數,該函數返回一個Publisher<U>,而不是一個U。該publisher表示應用于
每個元素的異步轉換。如果我們將其與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知道如何處理這些內部發布者:它將訂閱這些發布者,
然后將所有發布者合并為一個全局輸出,這是一個更有用的Flux<U>。
請注意,如果來自內部發布者的值在不同的時間到達,它們可以交叉插入到產生的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())));
    }
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容