kotlin協(xié)程實例分析(3)

請嘗試分析下列代碼實際輸出情況,以此來理解mapLatest操作符,這個流末端操作符還是非常有用的,舉個例子來說,比如用戶一直滑動鼠標,而你希望鼠標滑動時根據(jù)鼠標位置刷新某個東西,但如果你偵測鼠標事件刷新的話,那就太頻繁了,所以你希望用戶滑動過程中如果停頓一下再去刷新(可能這樣也不是最好,下回說其它操作符)
@Test
fun testMapLatest(){
    runBlocking {
        flow {
            emit("a")
            delay(100)
            emit("b")
            delay(100)
            emit("c")
            delay(220)
            emit("d")
            delay(400)
            emit("e")
            emit("f")
        }.mapLatest { value ->
            println("Started computing $value")
            delay(200)
            "Computed $value"
        }.collect{
            println("last result===>$it")
        }
    }

}

正確的解釋:
mapLatest操作符理解,當上游流中的某個元素持續(xù)一定時間不改變則會最終放入下游流
這個一定時間指的就是mapLatest操作符中delay的時間,上例是delay(200), 還有就是上游流中的最后一個元素(f)必然會被放入下游流中
那么根據(jù)這個規(guī)則 c, d, f將會被放入流中,因為c,d持續(xù)時間足夠長, f是最后一個
這個末端操作符和collectLatest規(guī)則是一樣的,可自行試試它。

在來看其它幾個常用的末端操作符,實際上我在官方安卓組織架構的demo中見到最多的就是這個mapLatest,其它的感覺有用,但實際中好像確實不太能用的到, 想象的挺好的,但實際就是不太有出場機會, 除非刻意去創(chuàng)造這個機會。
比如 map, first, last, single, conflate等等 有很多,自己研究研究,都不難理解了。 我之所以說這個mapLatest,就是因為我在安卓的標準架構工程demo那個什么sun-flower中看到它多次出場。

我認為可能很有的conflate也說一下吧

    /**
     * conflate我們在其它語言中有叫做防抖動的,說白了就是控制節(jié)奏
     * 不管上游流怎么折騰,我下游流就是不斷的按部就班的取上游流當前的最后一個
     * 當然我會保證第一個和最后一個一定被取到(這非常有必要), 你使用conflate時下游流 必然
     * 要有個delay(x), 不然等于沒用它一樣,毫無意義。 理解為在單位x時間內(nèi)上游流產(chǎn)生的值會被忽略掉即可
     */
    @Test
    fun testConflate(){
        val f = flow {
            for( i in 1..10){
                delay(100)
                emit(i)
            }
        }
        runBlocking {
            f.conflate().collect{
                delay(300)
                println(it)
            }
        }

    }

1
3
6
9
10

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容