0赞
赞赏
更多好文
从Java到Kotlin:那些年我踩过的变量、控制和函数坑
去年接手一个老Android项目,老板说“用Kotlin重写吧”。我心想:不就是加个val/var?结果第一天就翻车了——我把val写成var,结果在循环里改了不该改的值,线上日志刷屏“空指针”。那会儿真想把键盘砸了。后来才明白:Kotlin的语法不是“换个词”,是把Java里那些啰嗦的细节全藏起来了。今天不整大道理,就聊聊我怎么从“变量都分不清”到“写函数像写诗”的。
一、变量:别让val和var把你绕晕
Java式思维:
String name = "老王";
int age = 30;
(变量名+类型,硬编码,写多了手抽筋)
Kotlin式:
val name = "老王" // 只读,不能改!
var age = 30 // 可变,想改就改
为什么这玩意儿香?
- 类型自动推断:
val name = "老王",编译器一看就知道是String,不用写String name = "老王"。 val是救命稻草:我之前在Activity里写var isLogin = false,后来在回调里不小心改了,结果用户登录状态乱了。现在全用val,除非真要改,否则编译器直接报错——比写final还狠。- 小坑提醒:
val不是常量(像Java的final),而是只读引用。比如val list = mutableListOf(),list本身不能变,但list里的元素能改。别在循环里用val存集合,否则你得哭。
说实话,我第一次用Kotlin写Android时,还纠结“要不要全用
val”。后来在项目里试了两周,发现代码少了30%的null检查,同事都问:“这Kotlin真这么好用?”
二、控制流:别再写“if-else的地狱”
Java式写法:
if (age > 18) {
System.out.println("成年了");
} else {
System.out.println("未成年");
}
Kotlin式:
val status = if (age > 18) "成年了" else "未成年"
println(status)
关键区别:
if是表达式,不是语句!能直接赋值给变量,不用写大括号。when是switch的升级版,处理多条件超顺手:val role = "admin" val accessLevel = when (role) { "admin" -> "全权限" "user" -> "只读" else -> "未知角色" } println(accessLevel) // 输出:全权限
实战小故事:
上周改一个用户状态处理逻辑,Java里写了8行if-else if,Kotlin用when两行搞定。同事看到代码直接问:“这Kotlin是魔法吧?”——其实只是别再用Java的老脑筋了。when还能匹配范围:
val score = 85
val grade = when {
score in 90..100 -> "A"
score in 80..89 -> "B"
else -> "C"
}
三、函数:写得像写菜谱一样简单
Java式函数:
public String greet(String name) {
return "Hello, " + name;
}
Kotlin式:
fun greet(name: String): String = "Hello, $name"
为什么更爽?
- 省括号:一行写完,不用
{}和return。 - 默认参数:再也不用写一堆重载方法!
fun sendNotification(message: String, isUrgent: Boolean = false) { println("[$if(isUrgent) "URGENT" else "NORMAL"] $message") } // 调用:sendNotification("系统更新") // 不传isUrgent,默认false - 扩展函数:给现有类加方法,像给手机装APP!
// 给String加个方法:判断是否是邮箱 fun String.isEmail(): Boolean = contains("@") && contains(".") // 用起来: "test@example.com".isEmail() // true
我在项目里写了个
String.trim()的扩展,结果同事说:“这不就是trim()吗?”。我说:“但你不用写String.trim(),直接" hello ".trim()就行啊!”——这叫“让代码像说话”。
最后:别被“Kotlin很酷”骗了
网上总说Kotlin“优雅”“现代”,但说实话,它不酷,它只是把Java的糟心事藏起来了。
- 变量:
val让你少犯错,不是为了装逼。 - 控制流:
when不是新语法,是把“if-else链”从地狱拉回人间。 - 函数:默认参数和扩展,是让代码少写50%的重复。
上周和一个老Android工程师聊,他翻出自己2015年的Java代码,说:“那时候写个登录,光if (user != null)就占了1/3行。”现在Kotlin一行搞定,他笑说:“这玩意儿早该这么写。”
动手试试:
别光看文章,打开Android Studio,新建个Kotlin文件,写个函数:
fun main() {
val name = "小明"
val greeting = greet(name)
println(greeting)
}
fun greet(name: String) = "你好,$name!"
运行一下——不是“Hello World”,是“你好,小明!”。
这才是Kotlin的起点:它不教你新东西,它只是让你少写点废话。
(PS:别再纠结“val和var哪个好”,用val,除非你确定要改。我试过,真香。)
