Kotlin 和 Java 作为 JVM 生态中两大主流编程语言,在语法特性、开发效率和适用场景上存在显著差异。Kotlin 凭借现代化设计解决了 Java 的许多痛点,而 Java 凭借成熟生态和广泛支持仍是企业级开发的主力。
Java 转换到 Kotlin
Kotlin 采用极简语法设计,相比 Java 减少约 40% 的样板代码量:
类型声明反转
String name = "Kotlin";
final int age = 30;
在 Kotlin 中
val name: String = "Kotlin"
val name = "Kotlin" // 不可变变量 相当于 final
var age = 30; // 可变变量
方法定义优化
fun max(a: Int, b: Int) = if (a > b) a else b
fun sum(a: Int, b: Int): Int {
return a + b
}
类属性访问
会自动生成 get set 方法
非空约束
var nonNull: String = "value" // 编译时强制非空
var name: String? = null // 可空类型
val length = nonNull.length // 无需判空
// 安全调用
val nameLen = name?.length
// Elvis 操作符
val l = name?.length ?: -1
安全调用链
user?.address?.street?.length ?: 0
平台类型处理
val javaList: List<String!> = JavaClass.getList()
不可变集合创建
val readOnlyList = listOf(1, 2, 3)
val mutableMap = mutableMapOf("a" to 1)
流式处理
list.filter { it > 5}
.map { it * 2 }
.take(10)
数据类
data class User(val name: String, val age: Int)
数据类自动生成 equals() 和 hashCode() 方法
Sealed 类
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val msg: String) : Result()
}
原始类型数组
val intArray = IntArray(10)
协程
简化了异步编程
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000L)
println("world!")
}
println("hello")
}
扩展函数
通过扩展函数,为现有的类添加新方法
fun String.addExclamation() = this + "!"
val str = "Hello".addExclamation() // Hello!
Kotlin 中的扩展函数的设计和我之前学习的 Dart 函数有一些相似。Dart 使用 extension 关键字定义扩展,Kotlin 直接是在函数前加上了接受者类型。
设计的目的都是为了扩展当前的类,为当前的类添加新功能,而无需修改原始类,遵循开闭原则。
一些区别
- Kotlin 的扩展函数可以定义在任何地方,包括类内部。Dart 扩展函数智能定义在顶层。
- Dart 和 Kotlin 都支持泛型扩展
- Dart 不允许在 dynamic 类型上扩展,Kotlin 允许在动态类型上扩展
- Dart 可以通过 as 关键字来解决命名冲突,Kotlin 通过导入时重命名解决冲突
- Dart 可以创建未命名扩展,Kotlin 扩展函数可见性与普通函数相同