以下是为Android开发者整理的20个Kotlin语法糖,结合具体场景对比Java代码,让你的代码更简洁高效:
1. 数据类替代POJO(自动生成equals()
/hashCode()
/toString()
)
// Kotlin(1行搞定)
data class User(val name: String, val age: Int)
// Java(需手写或Lombok)
public class User {
private String name;
private int age;
// 构造方法/getter/setter/equals/hashCode/toString...
}
2. 扩展函数(为现有类添加方法)
// 扩展函数:显示Toast
fun Context.toast(message: String) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
// 使用
context.toast("Hello Kotlin!")
3. 空安全操作符(告别NullPointerException)
val length: Int? = text?.length // 安全调用
val nonNullText = text!!.trim() // 非空断言(慎用)
text?.let {
// 仅在非空时执行
}
4. 作用域函数(apply
/also
/let
/run
/with
)
// 初始化View并设置属性
val textView = TextView(context).apply {
text = "Hello"
textSize = 16f
setOnClickListener { /*...*/ }
}
5. 默认参数与命名参数(减少方法重载)
// 定义
fun loadImage(url: String, placeholder: Int = R.drawable.placeholder) { /*...*/ }
// 使用
loadImage("http://...") // 使用默认占位图
loadImage("http://...", placeholder = R.drawable.error) // 命名参数
6. 字符串模板(告别String.format()
)
val message = "User $name (age: ${user.age}) logged in."
7. 集合操作符(替代循环)
// 过滤+转换
val adults = users.filter { it.age >= 18 }.map { it.name }
// Java等效
List<String> adults = new ArrayList<>();
for (User user : users) {
if (user.getAge() >= 18) {
adults.add(user.getName());
}
}
8. 单例模式(object
关键字)
object ApiService {
fun fetchData() { /*...*/ }
}
// 调用
ApiService.fetchData()
9. 懒加载属性(by lazy
)
// 首次访问时初始化
val recyclerView: RecyclerView by lazy { findViewById(R.id.recycler_view) }
10. 简化点击事件(Lambda代替匿名内部类)
button.setOnClickListener {
// 处理点击
}
// Java对比
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 处理点击
}
});
11. 类型判断与转换(is
和as?
)
if (view is TextView) {
view.text = "Hi" // 自动类型转换
}
val text = view as? TextView // 安全转换(失败返回null)
12. 解构声明(Destructuring)
val (name, age) = user // 自动拆解data类的属性
13. 区间表达式(..
和until
)
for (i in 0..10) { } // 0到10(包含10)
for (i in 0 until 10) { } // 0到9
14. 函数类型参数(高阶函数)
// 定义
fun doAfter(delay: Long, action: () -> Unit) {
Handler(Looper.getMainLooper()).postDelayed(action, delay)
}
// 调用
doAfter(1000) {
showToast("Done!")
}
15. when
表达式(增强版switch)
val type = when (view) {
is Button -> "Button"
is TextView -> "Text"
else -> "Unknown"
}
16. 属性委托(by
关键字)
// 使用委托存储SharedPreferences
var userId by Delegates.preferences(context, "user_id", 0)
17. 协程简化异步代码(替代AsyncTask
/Thread
)
lifecycleScope.launch {
val data = withContext(Dispatchers.IO) { fetchData() } // 后台线程
updateUI(data) // 主线程
}
18. 简化Bundle传参(Parcelize
插件)
@Parcelize
data class User(val name: String, val age: Int) : Parcelable
// 传递
intent.putExtra("user", user)
19. Elvis操作符(?:
提供默认值)
val length = text?.length ?: 0 // 如果text为null,返回0
20. 内联函数(inline
优化Lambda开销)
inline fun measureTime(block: () -> Unit) {
val start = System.currentTimeMillis()
block()
println("Time: ${System.currentTimeMillis() - start}ms")
}
使用场景示例:
- RecyclerView Adapter:用数据类定义Item,结合扩展函数简化ViewHolder绑定逻辑
- 网络请求:协程 + Retrofit + 高阶函数封装错误处理
- UI初始化:
apply
函数链式设置View属性 - 数据过滤:集合操作符替代嵌套循环
这些语法糖不仅能减少代码量,还能提升可读性和维护性,让Android开发更高效优雅! 🚀