Kotlin 基础
文章平均质量分 90
okclouderx
这个作者很懒,什么都没留下…
展开
-
Kotlin的协程:flow
之前介绍的启动协程方法,比如 launch、async 都是协程的单次启动。如果有复杂场景,比如发送多个数据,就需要使用 flow 数据流。在 flow 中,数据如水流一样经过上游发送,中间站处理,下游接收。flow 是 kotlin 提供的解决复杂异步场景的方案。flow 由创建、中间操作符、终止操作符三个部分组成。flow 的生命周期可以分为 onStart 和 onComplete,与它们在 flow 的位置无关。flow 的异常处理使用 catch。catch 与位置相关。原创 2022-10-19 17:34:35 · 1283 阅读 · 0 评论 -
Android Jetpack Compose介绍
Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API,可以帮助您简化并加快 Android 界面开发。2019年5月,Google在I/O大会上公布Compose2020年9月,发布第一个Alpha版本2021年7月,发布第一个稳定版本参数指定默认值。函数参数很多时,可以分为必选参数和可选参数。命名参数可以不按照顺序传参。举例:文本控件只需要传入文字是什么。Text API定义2.2 高阶函数参数是函数的函数原创 2022-07-08 00:16:16 · 960 阅读 · 0 评论 -
Kotlin的协程:上下文
Kotlin 的协程上下文叫做 CoroutineContext,通常用来切换线程池。launch 的第一个参数 context 是 CoroutineContext,默认值是 EmptyCoroutineContext。如果需要指定 launch 工作的线程池,就需要指定 CoroutineContext 参数。withContextwithContext 用来切换线程执行代码。它的第一个参数是 CoroutineContext,指定线程池。在 getUserInfoIo 中指定 withConte原创 2022-06-30 19:09:13 · 1094 阅读 · 0 评论 -
Kotlin的协程:生命周期
Job使用 launch 函数启动协程后,launch 会返回 job 作为返回值。可以通过 job 监控协程的生命周期状态,并且控制协程的生命周期。job 的生命周期状态![协程 Job 生命周期.jpg](https://img-blog.csdnimg.cn/img_convert/8e5b895cc8fd0d15c6850c118b4960f5.png#clientId=u19026c21-d676-4&crop=0&crop=0&crop=1&crop=1&原创 2022-05-19 17:47:59 · 979 阅读 · 0 评论 -
Kotlin的协程:挂起函数
挂起函数挂起函数是指使用 suspend 关键字修饰的函数。suspend fun getUserInfo(): String { withContext(Dispatchers.IO) { delay(1000L) } return "BoyCoder"}挂起和恢复挂起函数与普通函数的区别在于:挂起函数可以挂起和恢复。挂起和恢复也是协程与线程相比的优势。考虑下面一种场景:获取用户信息获取用户的好友获取每位好友的动态如果使用 Java,可能会原创 2022-05-06 15:26:02 · 3055 阅读 · 0 评论 -
Kotlin协程:启动协程
Kotlin 启动协程有 3 种方式:launch、async 和 runBlocking。在使用协程之前需要引入协程库依赖。"org.jetbrains.kotlinx:kotlinx-coroutines-core:$versions.coroutines"在运行示例前,配置协程调试 VM 参数:Edit config -> VM options-Dkotlinx.coroutines.debuglaunchlaunch用来启动协程,但是不需要获取运行后的返回结果。它类似于”射箭原创 2022-05-01 00:01:08 · 2656 阅读 · 0 评论 -
Kotlin的泛型:协变与逆变
Kotlin 的协变与逆变统称为 Kotlin 的变型。变型是指泛型的基础类型与它的参数类型是如何关联的。对于普通类型来说,我们可以使用子类代替父类,因为子类包含了父类的全部内容。但是对于泛型来说,如果泛型的基础类型相同,其中一个参数类型是另外一个参数类型的子类,泛型类也不存在这种继承关系,无法直接替换使用。要解除这些限制,就需要用到协变与逆变。变型变型的存在是为了解决函数的泛型参数传递问题。下面的代码中,printContents 接收 List 的参数,然后把 list 中的每个元素拼接成 St原创 2022-03-13 01:25:06 · 989 阅读 · 0 评论 -
Kotlin的泛型:类型擦除与实化
JVM 的泛型一般是通过类型擦除实现的,就是说泛型的类型实参在运行时不保留。和 Java 一样,Kotlin 的泛型在运行时也被擦除了,但是 Kotlin 可以通过将函数声明为 inline 来解决这个问题。Kotlin 可以声明一个 inline 函数,使用实化 reified 使其类型实参不被擦除。类型检查与转换在运行时,List 的类型实参 String 被擦除了,只能知道它是一个 List,不能知道它是否声明为一个字符串列表。list1 和 list2 在运行时每个都是 List,不原创 2022-02-22 15:58:39 · 1580 阅读 · 0 评论 -
Kotlin的泛型:泛型类型参数
Kotlin 的泛型是指带类型形参的类型。当泛型的实例被创建时,类型形参被替换为具体类型。以 Kotlin 的 list 方法为例,当创建一个字符串列表时,类型形参 T 被替换为具体类型 String。val strList: List<String>public inline fun <T> List(size: Int, init: (index: Int) -> T): List<T> = MutableList(size, init)除了 L原创 2022-02-15 17:36:48 · 4264 阅读 · 0 评论 -
Kotlin的委托机制
Kotlin 的委托机制在语言层面自动实现了 Java 的组合代理。Kotlin 的委托包括委托类、委托属性,使用 by 关键字表示委托。委托类假设有一个接口类 Db,用来保存数据。interface Db { fun save()}Db 有两个具体的实现类 SqlDb 和 GreenDaoDbclass SqlDb : Db { override fun save() { println("save sql db") }}class GreenD原创 2022-01-28 17:37:29 · 3608 阅读 · 0 评论 -
在 build.gradle.kts 添加 maven 仓库
在 build.gradle.kts 添加 maven 仓库使用 kotlin script DSL 配置 build.gradle.kts 时,添加 maven 仓库的方式如下:repositories { maven { setUrl("http://maven.aliyun.com/nexus/content/groups/public/") } ...原创 2020-01-05 22:31:52 · 13797 阅读 · 0 评论 -
Kotlin 扩展函数和扩展属性
Kotlin 扩展函数和扩展属性Kotlin 的扩展函数是定义在类外面的成员函数。扩展函数假如现有的类缺少一个你想要的方法,但是又无法改变它的内部结构,可以使用扩展函数给它添加一个方法,这一点类似 Java 一些工具类的静态方法。下面为 String 类添加一个 lastChar 扩展方法,用来查找最后一个字符。package stringfun String.lastChar() ...原创 2019-10-20 13:37:36 · 544 阅读 · 0 评论 -
Kotlin 带接收者的 lambda :with 和 apply
Kotlin 带接收者的 lambda :with 和 applyKotlin 标准库(Standard.kt)中提供了一些函数,使用它们可以方便地改写原有的代码。with 和 apply 方法是其中的 2 个函数,它们的都可以接受一个 lambda 函数体,而且在 lambda 函数体可以调用对象。with假如有以下代码,输出 A - Z 和一段文字。fun alphabet(): S...原创 2019-10-19 00:11:43 · 277 阅读 · 1 评论 -
Kotlin 类和属性
Kotlin 类和属性类在 Kotlin 定义一个类似 JavaBean 的 Person 类如下:class Person(val name: String)它等价于 Java 的以下代码,可以由 Intellij 转换过来。public class Person { private final String name; public Person(Stri...原创 2019-10-17 23:20:28 · 148 阅读 · 0 评论 -
Kotlin 函数和变量
Kotlin 函数和变量Hello, World!一个 Kotlin 的 Hello, World! 程序如下:fun main(args: Array<String>) { println("Hello, World!")}函数Kotlin 的函数声明如下:fun max(a: Int, b: Int): Int { return if (a >...原创 2019-10-17 00:25:03 · 132 阅读 · 0 评论