kotlin协程flow filter map flowOn zip combine(1)

本文通过示例介绍了Kotlin协程中的Flow使用,包括创建Flow、onCompletion、filter、map、flowOn、zip和combine等操作,展示了如何过滤、映射、调度和合并Flow数据流。
摘要由CSDN通过智能技术生成

kotlin协程flow filter map flowOn zip combine(1)

一、flow ,emit,onCompletion,collect

import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) {
    runBlocking {
        flow {
            emit("fly")
        }.onCompletion {
            println("完成")
        }.collect {
            println(it)
        }
    }
}

fly
完成

二、函数作为flow

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) {
    runBlocking {
        load().onCompletion {
            println("onCompletion")
        }.collect {
            println("collect $it")
        }
    }
}

fun load() = flow {
    for (i in 1..3) {
        emit(i)
        delay(100)
    }
}

collect 1
collect 2
collect 3
onCompletion

三、filter

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) {
    runBlocking {
        load().filter {
            it > 3
        }.onCompletion {
            println("onCompletion")
        }.collect {
            println("collect $it")
        }
    }
}

fun load() = flow {
    for (i in 1..5) {
        emit(i)
        delay(100)
    }
}

collect 4
collect 5
onCompletion

四、map,重组改写数据。

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) {
    runBlocking {
        load().filter {
            it > 3
        }.map {
            "fly-$it"
        }.onCompletion {
            println("onCompletion")
        }.collect {
            println("collect $it")
        }
    }
}

fun load() = flow {
    for (i in 1..5) {
        emit(i)
        delay(100)
    }
}

collect fly-4
collect fly-5
onCompletion

五、flowOn

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) {
    runBlocking {
        load().flowOn(Dispatchers.IO)
            .onCompletion {
                println("onCompletion")
            }.collect {
                println("collect $it")
            }
    }
}

fun load() = flow {
    for (i in 1..5) {
        emit(i)
        delay(100)
    }
}

collect 1
collect 2
collect 3
collect 4
collect 5
onCompletion

六、zip

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) {
    runBlocking {
        val flow1 = flowOf(1, 2, 3).onEach {
            delay(100)
        }

        val flow2 = flowOf("a", "b", "c").onEach {
            delay(200)
        }

        flow1.zip(flow2) { i: Int, s: String ->
            "$i-$s"
        }.onCompletion {
            println("onCompletion")
        }.collect {
            println(it)
        }
    }
}

1-a
2-b
3-c
onCompletion

七、combine

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) {
    runBlocking {
        val flow1 = flowOf(1, 2, 3).onEach {
            delay(200)
        }

        val flow2 = flowOf("a", "b", "c").onEach {
            delay(100)
        }

        flow1.combine(flow2) { i: Int, s: String ->
            "$i-$s"
        }.collect {
            println(it)
        }
    }
}

1-a
1-b
1-c
2-c
3-c

八、conflate 合并

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis

fun main(args: Array<String>) {
    runBlocking {
        val time = measureTimeMillis {
            val f = flow {
                for (i in 1..10) {
                    delay(100)
                    emit(i)
                }
            }
            val result = f.conflate().onEach { delay(501) }
            println(result.toList())
        }

        println(time)
    }
}

[1, 5, 10]
1686

九、debounce去重

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) {
    runBlocking {
        flow {
            emit(1)
            delay(50)

            emit(2)
            delay(40)

            emit(3)
            delay(300)

            emit(4)
            delay(30)

            emit(5)
            delay(700)
        }.debounce(300).collect{
            print(it)
        }
    }
}

35

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangphil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值