以下是通过与 Java 对比学习 Kotlin 的详细指南,突出语法差异和核心优势:
一、变量与常量
Java
java
final String name = "Java"; // 不可变变量
int age = 25; // 可变变量
age = 26; // 允许修改
Kotlin
kotlin
val name = "Kotlin" // 不可变变量(类型自动推断)
var age = 25 // 可变变量
age = 26 // 允许修改
对比:
- Kotlin 使用
val
/var
,无需显式类型声明(支持类型推断)。 - Java 的
final
对应 Kotlin 的val
,但 Kotlin 更简洁。
二、函数定义
Java
java
public int add(int a, int b) {
return a + b;
}
// 无默认参数,需重载
public void greet(String name) { ... }
public void greet() { greet("Guest"); }
Kotlin
kotlin
fun add(a: Int, b: Int) = a + b // 单行表达式
fun greet(name: String = "Guest") { ... } // 默认参数
对比:
- Kotlin 支持默认参数,减少重载方法。
- 函数写法更简洁,返回值类型后置(如
: Int
)。
三、空安全机制
Java
java
String str = null; // 允许直接赋 null
int length = str.length(); // 运行时抛出 NullPointerException
Kotlin
kotlin
var str: String? = null // 必须显式声明可空类型
val length = str?.length // 安全调用,返回 Int?
val len = str?.length ?: 0 // Elvis 操作符提供默认值
对比:
- Kotlin 在编译期强制处理空安全,减少
NullPointerException
。 - Java 需依赖
@Nullable
/@NotNull
注解或手动检查。
四、类与对象
Java
java
// 数据类需手动实现 toString/equals
public class Person {
private final String name;
private int age;
// 构造函数、getter/setter、toString 等需手动编写
}
Kotlin
kotlin
data class Person(val name: String, var age: Int) // 自动生成数据类方法
对比:
- Kotlin 的
data class
自动生成equals()
、hashCode()
、toString()
等。 - Java 需手动编写或使用 Lombok 库。
五、集合操作
Java
java
List<Integer> list = Arrays.asList(1, 2, 3);
List<Integer> evenList = new ArrayList<>();
for (Integer num : list) {
if (num % 2 == 0) evenList.add(num);
}
Kotlin
kotlin
val list = listOf(1, 2, 3)
val evenList = list.filter { it % 2 == 0 }
对比:
- Kotlin 提供丰富的函数式操作符(如
filter
、map
、groupBy
),代码更简洁。 - Java 8+ 支持 Stream API,但语法较冗长。
六、Lambda 表达式
Java
java
// 单方法接口(如 Runnable)
Runnable task = () -> System.out.println("Hello");
Kotlin
kotlin
val task = { println("Hello") } // Lambda 直接赋值
list.filter { it > 0 }.map { it * 2 } // 链式调用
对比:
- Kotlin 的 Lambda 更简洁,无需单方法接口。
- Java 的 Lambda 需依赖函数式接口(如
Runnable
、Consumer
)。
七、静态方法与伴生对象
Java
java
public class Utils {
public static final String TAG = "Utils";
public static void log(String msg) { ... }
}
// 调用:Utils.log("Hello");
Kotlin
kotlin
class Utils {
companion object {
const val TAG = "Utils"
fun log(msg: String) { ... }
}
}
// 调用:Utils.log("Hello")
对比:
- Kotlin 的
companion object
替代 Java 的静态成员。 - Java 的静态方法更直接,但 Kotlin 的伴生对象更灵活(可继承接口)。
八、扩展函数
Java
java
// 需通过工具类添加方法
public class StringUtils {
public static String addExclamation(String s) {
return s + "!";
}
}
String str = StringUtils.addExclamation("Hello");
Kotlin
kotlin
fun String.addExclamation() = "$this!"
val str = "Hello".addExclamation() // 输出 "Hello!"
对比:
- Kotlin 的扩展函数可直接为类添加方法,无需工具类。
- Java 需通过静态工具方法实现类似功能。
九、协程 vs 线程
Java
java
// 使用线程处理异步任务
new Thread(() -> {
try {
Thread.sleep(1000);
System.out.println("Task done");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
Kotlin
kotlin
// 使用协程(需引入 kotlinx.coroutines)
GlobalScope.launch {
delay(1000L) // 非阻塞挂起
println("Task done")
}
对比:
- Kotlin 协程简化异步代码,避免回调地狱。
- Java 的线程模型更底层,协程轻量级且资源消耗更少。
十、与 Java 互操作
Kotlin 调用 Java
kotlin
// 直接调用 Java 类
val list = ArrayList<String>() // 使用 Java 的 ArrayList
list.add("Kotlin")
Java 调用 Kotlin
java
// 调用 Kotlin 数据类
Person person = new Person("Alice", 30);
// 调用伴生对象方法
Utils.Companion.log("Hello");
对比:
- Kotlin 与 Java 可无缝互操作,但需注意空安全注解和静态方法调用。
总结:Kotlin 的优势
- 简洁性:减少样板代码(如数据类、类型推断)。
- 空安全 :编译期检查减少
NullPointerException
。 - 函数式编程:Lambda、扩展函数、集合操作符。
- 协程:简化异步编程。
- 互操作性:与 Java 100% 兼容,适合逐步迁移。
通过对比学习,可以更快掌握 Kotlin 的语法精髓!