了解科特林流程的綜合指南

https://ishanvohra2.medium.com/a-comprehensive-guide-to-understand-kotlin-flows-02fd02336d07

Kotlin 引入了經過一段時間的 Flow API,於其協程庫的 1.3.0 版本中。這個目標很簡單,就是簡化 Kotlin 語言中的異步編程和流處理。它如何幫助開發者呢?讓我們深入瞭解 Flow API,了解它的工作原理及如何有效使用。

Flow 是什麼?

官方文件說 Flow 是:

“一種異步數據流,順序提供值並正常或帶有異常地完成。”

簡單地說,flow 是具有生產者和收集者兩個端點的數據流。一個生產者或者發送數據到流中,另一個則收集相同的數據。這被定義為冷流。

我們可以使用兩種方式創建流。

使用 AbstractFlow 類別

我們可以實現 AbstractFlow 類別並在 collectSafely()函數中發送值。讓我們看下面的例子:

使用 flow{…}構建函數來創建流是一種更簡單的方法。我們不需要自定義類別,而且更容易使用。

在兩種情況下 main() 函數的輸出將是相同的。

使用中介運算符

我們只對上述定義的流所產生的奇數感興趣,該怎麼做呢?

在調用 collect()之前,我們可以使用一系列特定函數。讓我們使用一個名為 filter()的函數,並添加一個條件來僅收集奇數值。

上述代碼的輸出將是:

為了清楚起見,我們之前定義的 flow{…}構建函數實際上也發送了偶數,但 filter()函數在被收集前會丟棄這些值。

一個有趣的中介特性是我們可以在調用 collect()之前鏈接多個這些函數(多至我們想要的數量),這使我們能夠以任何格式獲得輸出。

讓我們看一個例子。如果我們在整數列表中有一個重複的項目,我們不希望收集相同的值一遍又一遍。我們可以使用一個名為 distinctUntilChanged()的函數,該函數可防止 collect()獲得上次收到的值。檢查下面的片段:

我們可以看到整數值 3 是連續重複的,但使用 distinctUntilChanged(),我們只會得到其中一個。讓我們運行上面的代碼來驗證。

有了這個,3 僅被收集了一次。

我們已經了解如何創建和使用其中產生的值。在我們的 Kotlin 代碼或項目中有情況需要滾動檢查數值變化,這是很好的方法。

但是,在項目中使用流有什麼好處嗎?

使用流的好處

異步進程:Flow 允許您以非阻塞和順序方式管理異步操作,消除了需要回調的需要,從而使代碼更易讀和易管理。

背壓管理:流本身處理背壓情況,防止生產者比消費者更快地提供數據,這消除了手動背壓處理的需要,這是異步編程中的一個常見挑戰。

空值支持:Flow 繼承了 Kotlin 的強大的空值安全特性,確保類型安全並減少代碼中空指針異常的風險。

協程整合:流建立在協程之上,這是 Kotlin 的一個內建特性,用於結構化併發。這種緊密整合簡化了流在現有基於協程的代碼中的使用,並利用了協程的優勢,如輕量級線程和取消能力。

結論

有了這個,我們可以結束這篇有關 Kotlin 流的入門文章。這是一種增加語言功能,應該受到歡迎,因為它使語言在處理數據流的情況下更加強大和獨立。有很多流的實現,例如 StateFlow,SharedFlow 等,這些在特定情況下非常有用,如果沒有任何現成的實現符合您的需求,創建新的自定義實現也是相當簡單的。

謝謝您的閱讀!如果您希望使應用程序或網站中的搜索功能更快。閱讀這篇有關防彈傘效應的文章,了解它如何提升您應用程序/網站的性能。

via Software Development on Medium

March 1, 2024 at 05:12PM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *