fun t1(name:String) = flow{
println("flow start : $name")
for(i in 0..3){
kotlinx.coroutines.delay(100)
emit("$name $i")// 向外面发一个数据
}
}
runBlocking{// 所有线程一起运行(顺序的话就删除launch就好)执行线程(流)执行完
launch {
t1("1").collect {
println("get1 $it")
}
}
// 开启第二个流
launch {
t1("2").collect {
println("get2 $it")
}
}
// 同一个流监听两次
launch {
val t = t1("3")
t.collect {
println("get4 $it")
}
t.collect {
println("get4 $it")
}
}
}
快速创建:
(1..3).asFlow().collect { value -> println(value) }
但是你不能修改延迟,所以可以增加map处理,或者增加过虑 filter
runBlocking {
launch {
(1..10).asFlow() // 一个请求流
.filter {
it % 2 == 0 // 只显示偶数
}
.map {
// 每个个过来的都延迟1000秒
delay(100)
"hi $it";
}
.collect { response -> // 指定变量名字,不再是it
println(response)
println(response)
// 这里延迟也有用的
delay(1000)
}
}
增加数据:
(1..3).asFlow() // 一个请求流
.transform { request ->
emit("Making request $request")
emit(performRequest(request))
}
.collect { response -> println(response) }
限制数据,例如只处理两次:
fun numbers(): Flow<Int> = flow {
try {
emit(1)
emit(2)
println("This line will not execute")
emit(3)
} finally {
println("Finally in numbers")
}
}
fun main() = runBlocking<Unit> {
numbers()
.take(2) // 只获取前两个
.collect { value -> println(value) }
}
更多参考这个