摘要:
This表达式 为了表示当前的 接收者 我们使用 this 表达式: — 在类的成员中,this指的是该类的当前对象。 — 在扩展函数或者带有接收者的函数字面值中,this 表示在点左侧传递的 接收者 参数。 如果 this 没有限定符,它指的是最内层的包含它的作用域。要引用其他作用域中的 this 阅读全文
摘要:
is 与 !is 操作符 我们可以在运行时通过使用 is 操作符或其否定形式 !is 来检测对象是否符合给定类型: if (obj is String) { print(obj.length) } if (obj !is String) { // 与 !(obj is String) 相同 prin 阅读全文
摘要:
解构声明 有时把一个对象 解构 成很多变量会很方便,例如: val (name, age) = person 这种语法称为 解构声明 。一个解构声明同时创建多个变量。我们已经声明了两个新变量:name 和 age ,并且 可以独立使用它们 println(name) println(age) 一个解 阅读全文
摘要:
select 表达式(实验性的) select 表达式可以同时等待多个挂起函数,并 选择 第⼀个可⽤的。 在通道中 select 我们现在有两个字符串⽣产者:fizz 和 buzz 。其中 fizz 每 300 毫秒⽣成⼀个“Fizz”字符串: fun CoroutineScope.fizz() = 阅读全文
摘要:
共享的可变状态与并发 协程可⽤多线程调度器(⽐如默认的 Dispatchers.Default)并发执⾏。这样就可以提出所有常⻅的并发 问题。主要的问题是同步访问共享的可变状态。协程领域对这个问题的⼀些解决⽅案类似于多线程领域 中的解决⽅案,但其它解决⽅案则是独⼀⽆⼆的。 问题 我们启动⼀百个协程, 阅读全文
摘要:
异常处理 本节内容涵盖了异常处理与在异常上取消。我们已经知道取消协程会在挂起点抛出 CancellationException 并且它会被协程的机制所忽略。在这⾥我们会看看在取消过程中抛出异常或同 ⼀个协程的多个⼦协程抛出异常时会发⽣什么。 异常的传播 协程构建器有两种形式:⾃动传播异常(launc 阅读全文
摘要:
通道:延期的值提供了⼀种便捷的⽅法使单个值在多个协程之间进⾏相互传输。通道提供了⼀种在流中传输 值的⽅法。 通道基础: ⼀个 Channel 是⼀个和 BlockingQueue ⾮常相似的概念。其中⼀个不同是它代替了阻塞的 put 操 作并提供了挂起的 send,还替代了阻塞的 take 操作并提 阅读全文
摘要:
异步流 挂起函数可以异步的返回单个值,但是该如何异步返回多个计算好的值呢?这正是 Kotlin 流(Flow)的 ⽤武之地。 表示多个值 在 Kotlin 中可以使⽤集合来表⽰多个值。⽐如说,我们可以拥有⼀个函数 foo() ,它返回⼀个包含三 个数字的 List,然后使⽤ forEach 打印它们 阅读全文
摘要:
协程上下⽂与调度器 协程总是运⾏在⼀些以 CoroutineContext 类型为代表的上下⽂中,它们被定义在了 Kotlin 的标准库 ⾥。 协程上下⽂是各种不同元素的集合。其中主元素是协程中的 Job,我们在前⾯的⽂档中⻅过它以及它的 调度器,⽽本⽂将对它进⾏介绍。 调度器与线程 协程上下⽂包含 阅读全文
摘要:
默认顺序调用 假设我们在不同的地⽅定义了两个进⾏某种调⽤远程服务或者进⾏计算的挂起函数。我们只假设它们都是有⽤的,但是实际上它们在这个⽰例中只是为了该⽬的⽽延迟了⼀秒钟: suspend fun doSomethingUsefulOne(): Int { delay(1000L) // 假设我们在这 阅读全文