摘要: 一,sequence有take时 代码: //处理按钮点击事件 binding.button3.setOnClickListener { val list1 = (1..1000) .asSequence() .filter { println("filter: ${it}") it % 2 == 阅读全文
posted @ 2025-08-09 18:21 刘宏缔的架构森林 阅读(8) 评论(0) 推荐(0)
摘要: 一,sequence的运行: 代码: //处理按钮点击事件 binding.button1.setOnClickListener { val list = listOf(1, 2, 3, 4, 5) val seq1 = list.asSequence() seq1.filter { println 阅读全文
posted @ 2025-08-09 18:21 刘宏缔的架构森林 阅读(11) 评论(0) 推荐(0)
摘要: 一,四个特点: 终端操作才会执行整个操作链: 如果不调用终端操作(如 toList、forEach),则不会执行任何操作;Sequence 通常是一次性的: 终端操作后不能再次使用,避免重复使用同一 Sequence;不缓存结果: Sequence 每次遍历都会重新计算,若需复用结果,应先转换为集合 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(9) 评论(0) 推荐(0)
摘要: 一,代码: //处理按钮点击事件 binding.button1.setOnClickListener { //从现有集合转换 val list = listOf(1, 2, 3) val seq1 = list.asSequence() println("seq1") seq1.forEach { 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(14) 评论(0) 推荐(0)
摘要: 一,两种超时处理方式 使用 withTimeout 或 withTimeoutOrNull 可以指定 Job 任务的超时时间。两者的区别在于: withTimeout 函数会在超时后抛出一个超时异常 TimeoutCancellationException withTimeoutOrNull 函数会 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(27) 评论(0) 推荐(0)
摘要: 一,例子:用cancel()取消job 代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { val job = launch { try { println("try start") delay(1000) printl 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(15) 评论(0) 推荐(0)
摘要: 一,例子: 代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { val job = launch { try { println("try start") delay(1000) println("try end") } 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(17) 评论(0) 推荐(0)
摘要: 一,例子:不用yield()挂起当前任务 说明:yield在协程中就可以简单的理解为,挂起当前任务(注意是任务),释放此线程的monitor让其他正在等待的任务公平的竞争,去获得执行权。 代码: 定义线程和函数 val singleDispatcher = newSingleThreadContex 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(35) 评论(0) 推荐(0)
摘要: 一,常见的协程作用域 协程的作用域用于统一管理协程,包括跟踪所有协程和取消所有协程。 常见的协程作用域有: GlobalScope:它是一种顶级协程。生命周期是进程级别的,只要应用进程还在运行,即使 Activity 或 Fragment 被销毁,此作用域下的协程仍然会执行。 MainScope:只 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(74) 评论(0) 推荐(0)
摘要: 一,例子:协程不能被取消: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { val scopeJob = Job() val scope = CoroutineScope(scopeJob) val coroutineJob 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(26) 评论(0) 推荐(0)
摘要: 一,例子:cpu密集型任务会使cancel()无效 代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { val startTime = System.currentTimeMillis() val job = launc 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(18) 评论(0) 推荐(0)
摘要: 一,两者的相同点和不同点: 共同点 首先,我们来看一下 coroutineScope 和 supervisorScope 的共同特性: 作用域嵌套:两者均可以嵌套在其他作用域中。 结构化并发:它们都强制执行结构化并发,即作用域会等待所有启动的子协程完成之后才会完成自身。 取消传播:从父协程向子协程传 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(33) 评论(0) 推荐(0)
摘要: 一,区别: supervisorScope 的直接子协程是可以捕获到异常的,因为这些 supervisorScope 的子协程需要自己处理异常。 与 supervisorScope 不同的是,coroutineScope 的直接子协程不能捕捉到异常 二,例子:supervisorScope的直接子协 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(11) 评论(0) 推荐(0)
摘要: 一,CoroutineExceptionHandler捕获异常的条件 CoroutineExceptionHandler 捕获异常需要两个条件: 这个异常是自动传播的。 CoroutineExceptionHandler 位于 CoroutineScope 的 CoroutineContext 中, 阅读全文
posted @ 2025-08-09 13:41 刘宏缔的架构森林 阅读(23) 评论(0) 推荐(0)
摘要: 一,CoroutineExceptionHandler不同的用法 统一给父协程定义一个 CoroutineExceptionHandler,如果一个子协程异常了,其他子协程也不需要继续的话就采用 coroutineScope 方法,默认的 Job 就是这种表现,如果一个子协程异常了,其他子协程还需要 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(48) 评论(0) 推荐(0)
摘要: 一,CoroutineContext 协程上下文包含哪些元素? Job:控制协程的生命周期。 CoroutineDispatcher: 指定分发任务的线程,这一项就是我们已经介绍过的调度器:Dispatchers。默认值是 Dispatchers.Default。 CoroutineName:指定协 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(14) 评论(0) 推荐(0)
摘要: 一,代码 代码: //处理按钮点击事件 binding.button1.setOnClickListener { runBlocking { log(1) val job = GlobalScope.launch(start = CoroutineStart.UNDISPATCHED) { log( 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(15) 评论(0) 推荐(0)
摘要: 一,例一:atomic模式启动 代码: //处理按钮点击事件 binding.button3.setOnClickListener { runBlocking { log(1) val job = GlobalScope.launch(start = CoroutineStart.ATOMIC) { 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(18) 评论(0) 推荐(0)
摘要: 一,协程的四大启动模式 LAZY 是懒汉式启动,launch 后并不会有任何调度行为,协程体也自然不会进入执行状态,直到我们需要它执行的时候。当需要它的运行结果的时候, launch 调用后会返回一个 Job 实例,对于这种情况,我们可以: 调用 Job.start,主动触发协程的调度执行 调用 J 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(23) 评论(0) 推荐(0)
摘要: 一,代码: fun listDemo() { //定义一个整数list val list = listOf(1, 2, 3, 4, 5, 6, 7) //集合类中持有函数类型的变量 val funlist: List<(Int) -> Boolean> = listOf({ it -> it % 2 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(10) 评论(0) 推荐(0)
摘要: 一,代码: 扩展: //第一个字符 fun String.firstChar(): String { if (this.isEmpty()) return "" return this[0].toString() } //最后一个字符 fun String.lastChar(): String { 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(7) 评论(0) 推荐(0)
摘要: 一,代码: //比较lambda和匿名函数的区别 fun diffLambAnoni() { //区别1:匿名函数通过fun关键字定义的 // lambda不用fun定义 //区别2:返回 Lambda表达式中,返回值是最后一个表达式的结果 //匿名函数中,必须使用 return关键字显式指定返回值 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(9) 评论(0) 推荐(0)
摘要: 一,代码: 代码: fun lamb() { // isOdd 是一个函数, (Int) -> Boolean, 参数是Int,返回是Boolean //直接使用Lambda表达式声明一个函数,这个函数判断输入的Int是不是奇数 val isOdd = { it: Int -> it % 2 == 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(14) 评论(0) 推荐(0)
摘要: 一,代码: //处理按钮点击事件 binding.button1.setOnClickListener { //Kotlin用直接使用 “=”来返回一个函数的值,这样的函数成为函数字面量 fun sum1(a: Int, b: Int) = a + b val res = sum1(3,8) pri 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(11) 评论(0) 推荐(0)
摘要: 一,代码: 例子: fun forExample2() { //until for (inex in 0 until 3){ // 不包含3 println("until: $inex ") } // .. for (inex in 0 ..2){ // 包含2 println("..: $inex 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(8) 评论(0) 推荐(0)
摘要: 一,代码: 例子: fun forExample1() { // Kotlin 集合 var list : List<String> = listOf<String>("apple", "banana", "kiwifruit") println("遍历集合") // 遍历list for(i in 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(50) 评论(0) 推荐(0)
摘要: 一,代码: fun whenExample() { //例1,普通用法 val number = 3 when (number) { 1 -> println("One") 2 -> println("Two") 3 -> println("Three") else -> println("Unkn 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(60) 评论(0) 推荐(0)
摘要: 一,代码: 1,定义函数: //一个比较大小的函数 fun max1(a: Int, b: Int): Int { val max = if (a > b) a else b return max } //代码块形式 fun max2(a: Int, b: Int): Int { val max = 阅读全文
posted @ 2025-08-09 13:40 刘宏缔的架构森林 阅读(12) 评论(0) 推荐(0)