請嘗試分析下列代碼實際輸出情況,以此來理解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ī)則是一樣的湃密,可自行試試它诅挑。
在來看其它幾個常用的末端操作符,實際上我在官方安卓組織架構(gòu)的demo中見到最多的就是這個mapLatest泛源,其它的感覺有用拔妥,但實際中好像確實不太能用的到, 想象的挺好的,但實際就是不太有出場機會达箍, 除非刻意去創(chuàng)造這個機會没龙。
比如 map, first, last, single, conflate等等 有很多,自己研究研究缎玫,都不難理解了硬纤。 我之所以說這個mapLatest,就是因為我在安卓的標準架構(gòu)工程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