{"id":19765767,"url":"https://github.com/xuexiangjys/kotlinsample","last_synced_at":"2025-10-12T21:41:01.448Z","repository":{"id":101671602,"uuid":"473720334","full_name":"xuexiangjys/KotlinSample","owner":"xuexiangjys","description":"Kotlin相关使用案例","archived":false,"fork":false,"pushed_at":"2023-12-15T14:39:01.000Z","size":248,"stargazers_count":15,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-08T19:03:07.774Z","etag":null,"topics":["coroutines","kotlin","samples","x-samples"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xuexiangjys.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"custom":"https://gitee.com/xuexiangjys/Resource/blob/master/doc/sponsor.md"}},"created_at":"2022-03-24T18:06:57.000Z","updated_at":"2023-09-15T05:49:07.000Z","dependencies_parsed_at":"2025-04-30T15:31:25.714Z","dependency_job_id":"f50998be-f848-4226-ac5b-0cb52b8cb07d","html_url":"https://github.com/xuexiangjys/KotlinSample","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/xuexiangjys/KotlinSample","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FKotlinSample","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FKotlinSample/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FKotlinSample/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FKotlinSample/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xuexiangjys","download_url":"https://codeload.github.com/xuexiangjys/KotlinSample/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FKotlinSample/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279013122,"owners_count":26085232,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coroutines","kotlin","samples","x-samples"],"created_at":"2024-11-12T04:19:22.822Z","updated_at":"2025-10-12T21:41:01.399Z","avatar_url":"https://github.com/xuexiangjys.png","language":"Kotlin","funding_links":["https://gitee.com/xuexiangjys/Resource/blob/master/doc/sponsor.md"],"categories":[],"sub_categories":[],"readme":"# KotlinSample\n\nKotlin相关的案例\n\n## 关于我\n\n| 公众号   | 掘金     |  知乎    |  CSDN   |   简书   |   思否  |   哔哩哔哩  |   今日头条\n|---------|---------|--------- |---------|---------|---------|---------|---------|\n| [我的Android开源之旅](https://t.1yb.co/Irse)  |  [点我](https://juejin.im/user/598feef55188257d592e56ed/posts)    |   [点我](https://www.zhihu.com/people/xuexiangjys/posts)       |   [点我](https://xuexiangjys.blog.csdn.net/)  |   [点我](https://www.jianshu.com/u/6bf605575337)  |   [点我](https://segmentfault.com/u/xuexiangjys)  |   [点我](https://space.bilibili.com/483850585)  |   [点我](https://img.rruu.net/image/5ff34ff7b02dd)\n\n----\n\n## Kotlin Coroutines\n\n* Coroutine：协程的概念和原理：协程是什么以及它的作用和特点，图解分析协程的工作原理。\n* Coroutine builders：协程的构建，协程构建器创建协程的三种方式。\n* CoroutineScope：协程作用域，协程运行的上下文环境，用来提供函数支持，也是用来增加限制。常见的7种作用域（包含Lifecycle支持的协程）以及作用域的分类和行为规则。\n* Job \u0026 Deferred：协程的句柄，实现对协程的控制和管理，Deferred有返回值。\n* CoroutineDispatcher：协程调度器,确定相应的协程在那个线程上执行，调度器的四种模式以及withContext主要是为了切换协程上下文环境。\n* CoroutineContext：协程上下文，表示协程的运行环境，包括协程调度器、代表协程本身的Job、协程名称、协程ID以及组合上下文的使用。\n* CoroutineStart：一个枚举类，为协程构建器定义四中启动模式。\n* suspend：挂起函数，Kotlin 协程最核心的关键字。一种避免阻塞线程并用更简单、更可控的操作替代线程阻塞的方法：协程挂起和恢复。\n\n### 集成 Coroutines\n\n```\nimplementation \"org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0\"\nimplementation \"org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0\"\n```\n\n### CoroutineContext\n\n\u003e CoroutineContext即协程的上下文，是 Kotlin 协程的一个基本结构单元。巧妙的运用协程上下文是至关重要的，以此来实现正确的线程行为、生命周期、异常以及调试。它包含用户定义的一些数据集合，这些数据与协程密切相关。\n\n* Job: 控制协程的生命周期；\n    * Deferred（async创建返回，可调用`await`获取返回结果)\n    * SupervisorJob(特殊的 Job，里面的子Job不相互影响，一个子Job失败了，不影响其他子Job的执行)\n* CoroutineDispatcher: 向合适的线程分发任务；\n    * Dispatchers.Default（一个CPU密集型任务调度器）\n    * Dispatchers.IO（和Default共用一个共享的线程池）\n    * Dispatchers.Unconfined（未定义线程池，默认在启动线程）\n    * Dispatchers.Main（主线程，在Android上就是UI线程）\n* CoroutineName: 协程的名称，调试的时候很有用；\n* CoroutineExceptionHandler: 处理未被捕捉的异常。\n\n### CoroutineStart\n\n\u003e 协程启动模式\n\n* CoroutineStart.DEFAULT: 协程创建后立即开始调度(可能在执行前被取消)\n* CoroutineStart.ATOMIC: 协程创建后立即开始调度，协程执行到第一个挂起点之前不响应取消(将调度和执行两个步骤合二为一)\n* CoroutineStart.LAZY: 只要协程被需要时，包括主动调用该协程的start、join或者await等函数时才会开始调度\n* CoroutineStart.UNDISPATCHED: 立即执行协程体中的内容（没有调度的过程）\n\n### CoroutineScope\n\n\u003e 协程作用域。定义协程必须指定其 `CoroutineScope`。`CoroutineScope` 可被看作是一个具有超能力的 `ExecutorService` 的轻量级版本。`CoroutineScope` 会跟踪所有协程，同样它还可以取消由它所启动的所有协程。\n\n* GlobalScope - 全局作用域，不推荐使用\n* runBlocking{} - 主要用于测试\n* MainScope - 可用于开发（SupervisorJob() + Dispatchers.Main）\n* LifecycleOwner.lifecycleScope - 推荐使用\n* ViewModel.viewModelScope - 推荐使用\n\n### coroutineScope \u0026 supervisorScope\n\n\u003e 两个函数都是挂起函数，需要运行在协程内或挂起函数内。\n\n`coroutineScope`和`supervisorScope`都会返回一个作用域，它俩的差别就是异常传播。\n\n* `coroutineScope` 内部的异常会向上传播，子协程未捕获的异常会向上传递给父协程，任何一个子协程异常退出，会导致整体的退出；\n* `supervisorScope` 内部的异常不会向上传播，一个子协程异常退出，不会影响父协程和兄弟协程的运行。\n\n----\n\n## Kotlin语法\n\n### let、with、run、apply、also等作用域函数\n\n函数\t| 函数块对象引用   | 返回值\t| 是否拓展函数    | 使用场景\n|---|---|---|---|---\nlet\t| it | Lambda表达式结果\t| 是\t| 1.适用于处理不为null的操作场景；2.明确一个变量所处的特定作用域范围内可使用。\nwith| this\t| Lambda表达式结果\t| 否(上下文对象作为参数)\t| 适用于同一个对象的公有属性和函数调用。\nrun\t| this\t| Lambda表达式结果\t| 是\t| 适用于let函数和with函数的任何场景。对对象中的属性进行赋值和计算结果；在需要表达式的地方运行语句。\napply\t| this\t| 返回this(对象本身)\t| 是 | 1.一般用于对象实例初始化的时候，需要对对象中的属性进行赋值；2.动态inflate一个View的时候需要给View绑定数据。\nalso| it| 返回this(对象本身) | 是 | 适用于let函数的任何场景，对传入的对象进行操作，一般用于多个拓展函数的链式调用。\n\n* 1.`let`函数一般统一做空判断处理。\n* 2.`with`函数在同一个对象的多个方法时，可以省去类名重复。\n* 3.`run`函数适用于`let`函数和`with`函数的任何场景。`run`=`let`+`with`。\n* 4.`apply`函数整体上和`run`函数相似，唯一不同就是它的返回值是对象本身。\n* 5.`also`适用于`let`函数的任何场景，唯一不同就是它的返回值是对象本身。\n\n### 变量基础\n\n* var：可变变量    var \u003c表识符\u003e : \u003c类型\u003e? = null/指定值\n* val：不可变变量   val \u003c表识符\u003e : \u003c类型\u003e? = null/指定值\n* `?`：表示该变量可为空\n* !!：不做空检查，判定一定非空，空的话会报错\n* lateinit： 修饰var变量，默认你会初始化，不做空检查\n* by lazy {}：修饰val变量，程序第一次使用到这个变量(或者对象)时再初始化\n* const：修饰val变量，代表常量\n* `data class`的copy()函数：进行对象的浅拷贝\n* `vararg`：代表可变数量的参数\n* `as`和`as?`：进行类型强转\n\n### 位运算\n\n\u003e Kotlin中的 位运算符 只对Int和Long两种 数据类型 起作用\n\n* 与: and(bits) == \u0026\n* 或: or(bits) == |\n* 左移: shl(bits) == \u003c\u003c\n* 右移: shr(bits) == \u003e\u003e\n\n### 数组和集合操作\n\n* 1.数组集合的创建\n\n```kotlin\n// 数组\nval intArray = intArrayOf(1, 2, 3)\n// 集合\nval intList = listOf(1, 2, 3)\nval intSet = setOf(4, 5, 4, 6, 7, 5)\n// 可变集合\nval mutableList = mutableListOf(1, 2, 3)\nmutableList.add(4)\nval mutableMap = mutableMapOf(\n    1 to \"1\",\n    2 to \"2\",\n    3 to \"3\"\n)\n```\n\n* 2.forEach：遍历\n\n```kotlin\nintArrayOf(1, 2, 3).forEach { i -\u003e\n  Log.e(TAG, \"遍历：$i\")\n}\n```\n\n* 3.filter：过滤\n\n```kotlin\n// 遍历每个元素并按给的条件进行过滤，最终形成新的集合\n// 结果：[4, 8]\nintArrayOf(1, 2, 3, 4, 8).filter { i -\u003e i \u003e 3 }\n```\n\n* 4.map：变换、\n\n```kotlin\n// 遍历每个元素并执行给定表达式，最终形成新的集合\n// 结果：[3, 6, 9]\nintArrayOf(1, 2, 3).map { i -\u003e i * 3 }\n```\n\n* 5.flatMap：变换、创建、合并\n\n```kotlin\n// 遍历每个元素，并为每个元素创建新的集合，最后合并到一个集合中\n// 结果：[3, 6, 9]\nintArrayOf(1, 2, 3).flatMap { i -\u003e\n    listOf(\"${i * 3}\", \"a\") // 👈 生成新集合\n}\n```\n\n* 6.find：寻找第一个符合要求的内容\n\n```kotlin\nlistOf(1, 2, 3, 4).find { it \u003e 2 }\n```\n\n* 7.any：判断是否存在符合要求的内容\n\n```kotlin\nlistOf(1, 2, 3, 4).any { it \u003e 2 }\n```\n\n* 8.count：获取符合要求内容的数量\n\n```kotlin\nlistOf(1, 2, 3, 4).count { it \u003e 2 }\n```\n\n* 9.maxBy：获取最大的内容\n\n```kotlin\nlistOf(1, 2, 3, 4).maxByOrNull { it }\n```\n\n### 反射使用\n\n* 1.反射设置/获取某个对象的成员属性: \n\n**xx.javaClass.getDeclaredField(\"xx\")**\n\n```kotlin\nstudent.javaClass.getDeclaredField(\"Name\").run {\n  isAccessible = true\n  // 设置\n  set(student, \"xuexiang\") \n  // 获取\n  get(student)\n}\n```\n\n* 2.反射设置/获取某个对象的静态属性: \n\n**xx::class.java.getDeclaredField(\"xx\")**\n\n```kotlin\nStudent::class.java.getDeclaredField(\"TotalNumber\").run {\n  isAccessible = true\n  // 设置\n  set(null, 1111)\n  // 获取\n  get(null)\n}\n```\n\n* 3.反射执行某对象的成员方法: \n\n**xx.javaClass.getDeclaredMethod(xx, xx::class.java)**\n\n```kotlin\nstudent.javaClass.getDeclaredMethod(\"getName\", Integer::class.java).run {\n  isAccessible = true\n  Log.e(TAG, \"invokeMethod: ${invoke(student, 23)}\")\n}\n```\n\n* 4.反射执行某个类的静态方法: \n\n**xx::class.java.getDeclaredMethod(xx, xx::class.java)**\n\n```kotlin\nStudent::class.java.getDeclaredMethod(\"incrementTotalNumber\", Int::class.java).run {\n  isAccessible = true\n  Log.e(TAG, \"invokeStaticMethod: ${invoke(null, 23)}\")\n}\n```\n\n* 5.反射构建实例: \n\n**xx::class.java.getDeclaredConstructor(xx::class.java...)**\n\n```kotlin\nStudent::class.java.getDeclaredConstructor(Int::class.java, String::class.java).run {\n  isAccessible = true\n  val std = newInstance(666, \"xiaohuang\")\n  Log.e(TAG, \"newInstance: $std\")\n  \n  GoodStudent::class.java.getDeclaredConstructor(Student::class.java).run {\n    isAccessible = true\n    val goodStd = newInstance(std)\n    Log.e(TAG, \"GoodStudent: $goodStd\")\n  }\n}\n```\n\n----\n\n\n## 相关文章\n\n* [Kotlin 语言中文站](https://www.kotlincn.net/docs/reference/)\n* [Kotlin 的变量、函数和类型](https://juejin.cn/post/6844903918888026126)\n* [Kotlin 里那些「不是那么写的」](https://juejin.cn/post/6844903920536551431)\n* [Kotlin 的协程用力瞥一眼](https://juejin.cn/post/6844903949686800392)\n* [Kotlin 里那些「更方便的」](https://juejin.cn/post/6844903923061358605)\n* [万字长文 - Kotlin 协程进阶](https://juejin.cn/post/6950616789390721037)\n* [Kotlin Coroutines Flow 系列(二) Flow VS RxJava2](https://juejin.cn/post/6844904057534939149)\n* [Kotlin 协程实战进阶](https://blog.csdn.net/m0_37796683/article/details/119424009)\n* [Kotlin系列文章](https://blog.csdn.net/m0_37796683/category_10088599.html)\n\n## 如果觉得项目还不错，可以考虑打赏一波\n\n\u003e 你的打赏是我维护的动力，我将会列出所有打赏人员的清单在下方作为凭证，打赏前请留下打赏项目的备注！\n\n![pay.png](https://raw.githubusercontent.com/xuexiangjys/Resource/master/img/pay/pay.png)\n\n## 联系方式\n\n\u003e 更多资讯内容，欢迎扫描关注我的个人微信公众号:【我的Android开源之旅】\n\n![](https://s1.ax1x.com/2022/04/27/LbGMJH.jpg)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxuexiangjys%2Fkotlinsample","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxuexiangjys%2Fkotlinsample","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxuexiangjys%2Fkotlinsample/lists"}