//1.表示多个值 流用于返回多个异步计算值
fun foo(): List<Int> = listOf(1, 2, 3)
fun forEachList() {
foo().forEach { value -> println(value) }
}
//2.序列
fun foos(): Sequence<Int> = sequence {//使用一个序列(Sequence)来表示数字
for (i in 1..3) {
Thread.sleep(1000)//等待100毫秒
yield(i)//下一个值
}
}
fun forEachSequences() {
foos().forEach { value -> println(value) }
}
//3 挂起函数
suspend fun foo_Suspending(): List<Int> {//suspend修饰不会阻塞主线程 ,List<Int>我们只能同时返回所有值
delay(1000)
return listOf(1, 2, 3)
}
fun main_Suspending() = runBlocking {
foo_Suspending().forEach { value -> println(value) }
}
//4.Flows
fun foo_flows(): Flow<Int> = flow {//构造器函数名为 flow 不再标记 suspend 修饰符
for (i in 1..3) { //flow{...} 中的代码块可以挂起
delay(2000)
emit(i)//值通过 emit 函数从流中发出
}
}
fun main_flows()= runBlocking<Unit> {
launch {//用于检查主线程是否阻塞
for (k in 1..3){
println("k $k")
delay(1000)//等待1000毫秒 不会阻塞主线程
}
}
foo_flows().collect { value -> println("$value") }// collect 函数从 flow 中取值
}
//5.流是冷的
fun foo_cold():Flow<Int> = flow {
for (i in 1..3){//flow 每次收集时都会启动
println("Flow开启")
delay(1000)
emit(i)
}
}
fun main_cold()= runBlocking {
val flows=foo_cold()
println("...$flows")
flows.collect { value -> println("$value")}//先开启,再打印值
println("...收集")
}
//6.取消流
fun foo_cancel():Flow<Int> = flow {
for (i in 1..3)
{
delay(1000)
emit(i)
}
}
fun main_cancel()= runBlocking {
withTimeoutOrNull(1200){//运行一个就取消了
foo_cancel().collect { value -> println("$value") }
}
println("end")
}
//7.流构建器 asFlow
fun main_asFlow()= runBlocking {
(1..3).asFlow().collect { value -> println("$value") }
}
//8.中间流运算符
suspend fun per_request(requst:Int):String{
delay(1000)
return "$requst"
}
fun main_map()= runBlocking {
(1..3).asFlow()//构建流
.map { request->per_request(request)}//中间运算符
.collect { value -> println("$value") }
}
//9.转换操作符
// suspend fun per_request(requst:Int):String{
// delay(1000)
// return "$requst"
// }
// fun main_map()= runBlocking {
// (1..3).asFlow()//构建流
// .map { request->per_request(request)}//中间运算符
// .collect { value -> println("$value") }
// }
|