从Java到Kotlin:那些年我踩过的变量、控制和函数坑

avatar
莫雨IP属地:上海
02026-02-16:22:28:06字数 2696阅读 0

从Java到Kotlin:那些年我踩过的变量、控制和函数坑

去年接手一个老Android项目,老板说“用Kotlin重写吧”。我心想:不就是加个val/var?结果第一天就翻车了——我把val写成var,结果在循环里改了不该改的值,线上日志刷屏“空指针”。那会儿真想把键盘砸了。后来才明白:Kotlin的语法不是“换个词”,是把Java里那些啰嗦的细节全藏起来了。今天不整大道理,就聊聊我怎么从“变量都分不清”到“写函数像写诗”的。


一、变量:别让valvar把你绕晕

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是表达式,不是语句!能直接赋值给变量,不用写大括号。
  • whenswitch的升级版,处理多条件超顺手:
    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,除非你确定要改。我试过,真香。)

总资产 0
暂无其他文章

热门文章

暂无热门文章