kotlin 5个提升编码技巧的功能

221 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

前言

你用 Kotlin 编程多久了?如果您认为自己了解 Kotlin 中可用的所有功能,那么请再想一想。以下是 Kotlin 中您可能不常用的 5 个提升编码技巧(bi-ge)的功能。

解构

以前在JavaScript看到过解构,就觉得很不错这个语法能力,现在这个功能在 Kotlin 中也可用。尤其是在compose中我们大量使用了解构这一能力。

fun main() {
  val book = Book("书名", 37.37)
  val numbers = listOf(1, 2, 3, 4)
  
  val (name, price) = book
  println("书的名字是$name,价格是$price")
  
  val (a, b, c) = numbers
  println(a + b + c) // 1 + 2 + 3 = 6
}

data class Book(
  val name: String,
  val price: Int
)

从一个对象,你可以收集它的属性;从集合中,你可以按顺序收集元素。

Collections KTX

首先我们先引入这个扩展库。

dependencies {
    implementation("androidx.collection:collection-ktx:1.2.0")
}

Collection 扩展程序利用 Kotlin 的运算符重载简化集合串联等操作,如以下示例所示:

// 官方代码
// 将 2 个 ArraySet 组合成 1 个。
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6) 

// 与数字组合创建一个新集合。
val newArraySet = combineArraySet + 7 + 8

延迟加载

延迟加载是 Kotlin 中我们最常用的,对于 Android 来说应该可以说它是很友好的。程序最初启动时不会加载该变量。它会在第一次调用时加载。对于Activity生命周期中,当onCreate的方法被触达时会调用binding变量,当变量被延迟加载时,初始化代码仅在第一次使用时运行。

class LazyActivity : AppCompatActivity() {
  private val binding by lazy(LazyThreadSafetyMode.NONE) {
    ActivityLazyBinding.inflate(layoutInflater)
  }
  
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent(binding.root)
  }
}

类型别名

当你厌倦了每次都定义相同的长数据类型的时候,那么Kotlin 有一个特性可以让你的代码看起来更好,阅读也更好。您可以用一个能更好地描述您的代码的词来替换所有长数据类型的实例。上才艺:

typealias Library = Book<String, Float>
  
fun getLibrary(): Library {
  return Book("书名", 37.37)
}

fun setLibrary(library: Library) {
  // todo
}

反引号

当你需要编写一个特定的变量名,但这是 Kotlin 中的一个关键字?当我们开始学习某一门语言的时候都会告诉你,关键字禁止作为变量名出现。但是在kotlin中其实是被允许的。上才艺:

fun main() {
  println(`this is fun`())
}

// 反引号
fun `this is fun`(): String {
  val `object` = "好了,你可以使用关键字命名了"
  return `object`
}

编码规范来说我们不建议用这种方式去命名方法、变量。我们一般是在单元测试的时候使用这种命名方式,方便我们解释方法含义或者标记某个变量属性等。

@Test 
fun `ni bu yao guan wo qu de shenme mingzi`() { 
  // 你的才艺
}

结论

Kotlin 永远不会让你大吃一惊。它是一种不断发展的编程语言,完美融合了您想要和需要的每个功能。语言已经有了这么大的飞跃;未来的更多更新只会让它变得更好。