严格类型、命名参数、多范式语言
您今天遇到的每个后端开发人员都会说他们使用 JavaScript、Python、PHP 或 Ruby 编写代码。近年来,您会遇到一小部分人转而使用 Kotlin 作为他们创建 Web 服务器的语言选择。由于我在学习Ktor,所以本文中的示例将使用Ktor进行说明。
Kotlin 是一种多范式编程语言。它支持来自其他各种语言的许多不同语言特性。如果缺少某个功能,在 Kotlin 中创建包含它的代码并不困难。例如,Haskell——一种纯函数式语言——使用.将两个函数组合在一起。在 Kotlin 中,您可以编写一个执行确切行为的函数。你可以在这里读更多关于它的内容:
将Kotlin函数与函数一起使用
https://medium.com/codex/mix-up-your-kotlin-functions-with-function-composition-c0f635d40c87
协程是轻量级的类似线程的操作,在并发和编写异步代码方面表现良好。与 Java 不同的是,Kotlin 摒弃了多线程的思想,采用了挂起函数和协程的方式。
协同程序的执行速度更快、效率更高。也有可能在同一个线程中执行多个协程。
fun main() = runBlocking { // this: CoroutineScope
launch { // launch a new coroutine and continue
delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
println("World!") // print after delay
}
print("Hello, ") // main coroutine continues while a previous one is delayed
}
在 Kotlin 中,您可以通过使用参数名称及其值来调用函数,而不考虑参数的顺序。这使得代码具有很高的可读性和更易于调试。在函数定义中使用默认参数命名参数需要高度的灵活性。
fun Application.configureRoutes() {
routing {
route("/greet") {
get {
call.respondText(
text = "Hello, World!", // <- named parameters
status = HttpStatusCode.OK
)
}
}
}
}
上面显然不是最好的代码,但它展示了命名参数的用法。
您在上面看到的也是扩展函数的示例。
在其他编程语言中,您不能向现有类(这是一个只读文件)添加函数。但是,在 Kotlin 中,您可以定义扩展函数,它们的行为就好像它们是该特定类的成员一样。
fun String.countDigits(): Int {
return this.count { it in '0'..'9'}
}
fun main() {
println("hello1234".countDigits())
}
我无法更改 的定义String,但可以使用用户定义的函数对其进行扩展。
在处理后端开发时,数据类非常重要。它们(带有列表)很容易序列化为 JSON 数据。数据类用于创建具有原始数据类型的模型对象。当且仅当它们也是数据类(可序列化)时,才可以使用复杂数据类型。
使用数据类的好处是
toString
自动生成。equals
生成比较其属性内容的函数。copy
将属性复制到新对象中的内置函数。class Order(
val number: Int,
val items: List<String>
)
data class OrderData(
val number: Int,
val items: List<String>
)
fun main() {
val ord1 = Order(1, listOf("Banana"))
val ord2 = Order(1, listOf("Banana"))
val ord3 = OrderData(2, listOf("Apple"))
val ord4 = OrderData(2, listOf("Apple"))
println(ord1) // Order@65b54208
println(ord3) // OrderData(number=2, items=[Apple])
println(ord1 == ord2) // false
println(ord3 == ord4) // true
val ord5 = ord1.copy() // Compilation error
val ord6 = ord3.copy(
items = ord3.items + "Orange" // Modifying the items property
)
println(ord6) // OrderData(number=2, items=[Apple, Orange])
}
请注意我是如何使用命名参数来指定在复制数据类实例时需要更改的属性的。
Kotlin DSL 是 JetBrains 实现的一项出色功能。这使您可以使用 Kotlin 轻松地为任何其他语言创建代码。例如,如果您希望通过传入请求发回 HTML 文件,您可以在 Kotlin 中编写 HTML DSL 代码并返回其字符串表示形式。
导入正确的依赖项后,您可以编写 DSL,如下所示:
fun main () {
val htmlContent = html {
head {
title { + "This is Kotlin DSL" }
style {
css( ".color-red" ) {
color = "#ff0000"
}
css( "h1" ) {
cursor = "pointer"
fontSize = "2.5rem"
}
}
}
body {
h1 {
+ "标题 1 有 2.5rem 大。"
}
p(className = "color-red"
b { + "和粗体" }
}
}
}
println(htmlContent)
}
Kotlin的Build DSL将改变你的编程方式
https://medium.com/codex/kotlins-builder-dsl-will-change-the-way-you-code-931ecd03012d
已经有许多库可供 Kotlin 爱好者使用。最受欢迎的是:
我上面的一些例子说明了 Ktor 的使用。
Ktor 是一个框架,可以轻松构建连接的应用程序——Web 应用程序、HTTP 服务、移动和浏览器应用程序。现代连接的应用程序需要异步才能为用户提供最佳体验,而 Kotlin 协程提供了很棒的工具来以简单直接的方式做到这一点。
http4k 服务器只是一个常规函数,它被请求调用并返回响应。
一个简单的 Java 和 Kotlin 网络框架
在您的应用程序中使用 Spring Boot,只需几行代码就可以像老板一样开始构建服务。