官方编程引导文档:接口 · Kotlin 官方文档 中文版 |
by
关键字用法
| by关键字用于实现委托模式。委托模式答应一个对象将某些操纵委托给另一个对象来处置处罚,从而减少代码重复和进步代码的可维护性。如类委托(绑定接口到另一个对象),属性委托(绑定属性到另一个类属性)
|
associateWith/associateBy/associate | 将集合的值作为Map的键或值,并返回Map |
groovy转kts | allowInsecureProtocol 改为isAllowInsecureProtocol=true
https://developer.android.com/build/dependencies?hl=zh-cn#kts
Gradle迁移指南:从Groovy到KTS - 简书
Migrating build logic from Groovy to Kotlin
Gradle Kotlin DSL Primer
Declaring dependencies
|
Android构建资料 | https://developer.android.com/studio/build?hl=zh-cn
Gradle Kotlin DSL Primerhttps://docs.gradle.org/current/userguide/core_dependency_management.htmlGradle Kotlin DSL Primer
|
maven发布 | https://github.com/gradle/kotlin-dsl-samples/blob/master/samples/maven-publish/build.gradle.kts |
Kotlin注解 | 以下是 Kotlin 中的一些常见注解及其说明:
@JvmStatic: 将伴生对象(Companion Object)中的函数或属性编译为与 Java 兼容的静态函数或属性。
@JvmOverloads: 生成多个重载方法或构造函数,以便在与 Java 代码进行交互时可以省略部分参数。
@JvmField: 将属性生成为公共的 Java 字段,而不生成对应的 getter 和 setter 方法。
@Volatile: 标志属性为volatile,以确保多线程访问时的可见性。
@Synchronized: 修饰方法,将方法的实行体放在同步块中,确保方法的原子性。
@Throws: 标志方法大概会抛出指定的非常,以便为 Java 调用者提供非常信息。
@Deprecated: 标志函数、属性或类为过期的,在调用时会发出告诫或错误。
@Suppress: 禁用指定范例的告诫,可以级联多个告诫范例。
@JvmName: 指定生成的 Java 方法或属性的名称。
@JvmMultifileClass: 将多个 Kotlin 文件编译成一个 Java 类。
@JvmSynthetic: 标志生成的方法或属性为一个合成方法,不会公开给 Java 代码。
@Target: 指定注解的使用范围,如方法、类、属性等。
这些只是 Kotlin 注解的一小部分,另有其他一些用于特定用途的注解。每个注解都有其特定的用途和行为,可以根据现实需求选择适合的注解来使用。在编写 Kotlin 代码时,将这些注解与代码的需求相匹配可以提供更好的互操纵性和代码质量。
|
inner关键字用法 | 使用 inner 关键字的区别在于,假如内部类须要访问外部类的成员(包罗属性和方法),那么须要将内部类声明为 inner 类。这样内部类就会持有一个对外部类对象的引用,并可以直接访问外部类的成员。
假如不使用 inner 关键字声明内部类,那么它就是一个嵌套类(nested class),它不持有对外部类对象的引用,也就无法直接访问外部类的成员。嵌套类的行为更像是普通的顶层类,它与外部类之间没有特殊的关联。
|
launch(Dispatchers.Default) 和 GlobalScope.launch 和 withContext(Dispatchers.IO) | GlobalScope.launch适合于全局性的使命,launch(Dispatchers.Default)适合于受外部作用域控制的使命,而withContext(Dispatchers.IO)不启动协程,适合于在差别调理器上实行特定范例的使命。在现实使用中,应根据具体的需求选择合适的方式来启动协程 |
| 懒加载 |
lateinit | 耽误加载 |
::myVariable.isInitialized | ::myVariable.isInitialized 的工作原理是获取变量 myVariable 的引用,然后访问它的 isInitialized 属性。:: 运算符返回的是一个引用,而不是变量本身,因此不会触发对变量的访问,也就不会抛出非常。- 判断耽误加载是否初始化 |
suspend关键词 | * `suspend` 关键字用于声明一个挂起函数。挂起函数可以在协程中使用,它答应协程在等待异步操纵完成时停息实行。
* 挂起函数必须在协程作用域内调用。协程作用域可以使用 `runBlocking`、`launch` 或 `async` 函数创建。
* 挂起函数可以使用 `await` 关键字来等待异步操纵完成。`await` 关键字会停息协程的实行,直到异步操纵完成。
* 挂起函数还可以使用 `yield` 关键字来停息协程的实行。`yield` 关键字会停息协程的实行,并返回一个值。当协程再次恢复实行时,它将从 `yield` 关键字处继续实行。 |
协程 | 创建协程不会创建线程。协程是在现有的线程上运行的。这意味着协程可以比线程更有用地利用系统资源。
以下是一些协程和线程的具体区别:
特性 协程 线程
创建和烧毁开销 小 大
实行方式 合作式 抢占式
调理方式 基于变乱循环 基于时间片
资源利用率 高 低
|
viewModelScope、liveCycleScope與livedata builder | https://medium.com/@alice.margatroid.love/%E7%AD%86%E8%A8%98-coroutine%E7%B0%A1%E4%BB%8B-%E4%B8%89-viewmodelscope-livecyclescope%E8%88%87livedata-builder-e8be67aade8 |
private fun continueDetect(resultCallbackPair<Int, Float>>)->Unit)
匿名函数作为参数和调用
| private val resultCallback = { result: List<air<Int, Float>> ->
val sceneType = if (result.isNotEmpty() && result.first().second > 0.5) SceneType.Concert else SceneType.UNKNOWN
result.forEach {
showTip("sceneType is : ${sceneType.name} id{it.first} score{it.second}")
return@forEach // Use return@forEach to break the loop
}
} |
LaunchedEffect 在Compose中启动协程 | 它答应你在 Composable 函数中启动一个协程,并确保协程在 Composable 重组时能够正确地处置处罚。 |
kotlin图数据结构 | Kotlin 标准库中没有提供 graph 图形结构,但有很多第三方库可以用来表示和操纵图。其中一些最受欢迎的库包罗:
jgrapht:jgrapht 是一个功能齐全的图库,它提供了各种算法和数据结构来表示和操纵图。它支持有向图和无向图,并提供了很多有用的功能,如深度优先搜刮、广度优先搜刮、最短路径计算等。
kotlin-grap
|