1. 概述
本文将带你了解如何将 Java 项目逐步迁移到 Kotlin。虽然我们会涉及一些基础示例,但这篇文章 不是 Kotlin 入门教程。如果你需要系统学习 Kotlin,建议先阅读 这篇基础文章。
我们将从简单的语句迁移开始,比如打印语句、变量定义、空值处理等。然后逐步深入到控制语句(如 if-else 和 switch)、类定义和集合操作等内容。
✅ 目标读者:有经验的 Java 开发者
⚠️ 风格说明:简洁为主,适当使用“踩坑”、“简单粗暴”等表达方式增强可读性
2. 基础语法迁移
我们先来看几个最基础的语句在 Java 和 Kotlin 中的对比。
2.1. 打印语句
Java 中:
System.out.print("Hello, Baeldung!");
System.out.println("Hello, Baeldung!");
Kotlin 中:
print("Hello, Baeldung!")
println("Hello, Baeldung!")
✅ 简单粗暴,少了一个 System.out
,更清爽。
2.2. 变量定义
Java 中:
final int a;
final int b = 21;
int c;
int d = 25;
d = 23;
c = 21;
Kotlin 中:
val a: Int
val b = 21
var c: Int
var d = 25
d = 23
c = 21
📌 注意点:
val
对应final
,表示不可变变量var
表示可变变量- 类型推导强大,大多数情况下无需显式声明类型
- 分号可选,更贴近现代语言风格
2.3. 类型转换(Casting)
Java 中经常要手动强转:
if(str instanceof String){
String result = ((String) str).substring(1);
}
Kotlin 的智能类型转换(smart casting)直接省去强转:
if (str is String) {
val result = str.substring(1)
}
✅ 简洁又安全,避免了 ClassCastException 的风险。
2.4. 位运算
Java 中:
int orResult = a | b;
int andResult = a & b;
int xorResult = a ^ b;
int rightShift = a >> 2;
int leftShift = a << 2;
Kotlin 中:
var orResult = a or b
var andResult = a and b
var xorResult = a xor b
var rightShift = a shr 2
var leftShift = a shl 2
📌 Kotlin 中位运算使用中缀函数,可读性更强,语法更自然。
3. 空安全(Null-Safety)
Java 中:
final String name = null;
String text;
text = null;
if(text != null){
int length = text.length();
}
Java 中对 null 的处理全靠手动判断,容易出错。
Kotlin 中:
val name: String? = null
var lastName: String?
lastName = null
var firstName: String
firstName = null // ❌ 编译错误!
📌 Kotlin 默认非空类型,若要允许 null,需显式声明为 String?
。
✅ 空指针异常(NPE)在 Kotlin 中几乎绝迹,除非你非要用 !!
强行解包。
4. 字符串操作
Java 中:
String name = "John";
String lastName = "Smith";
String text = "My name is: " + name + " " + lastName;
String otherText = "My name is: " + name.substring(2);
String text = "First Line\n" +
"Second Line\n" +
"Third Line";
Kotlin 中:
val name = "John"
val lastName = "Smith"
val text = "My name is: $name $lastName"
val otherText = "My name is: ${name.substring(2)}"
val text = """
First Line
Second Line
Third Line
""".trimMargin()
📌 Kotlin 支持字符串插值(interpolation)和原生多行字符串,非常方便。
⚠️ 注意:
- 单行拼接使用
$
或${}
- 多行字符串使用
"""
,并可通过trimMargin()
去除前导空格
5. 循环与控制语句
5.1. For 循环
Java 中:
for (int i = 1; i < 11 ; i++) { }
for (int i = 1; i < 11 ; i+=2) { }
for (String item : collection) { }
for (Map.Entry<String, String> entry: map.entrySet()) { }
Kotlin 中:
for (i in 1 until 11) { }
for (i in 1..10 step 2) { }
for (item in collection) { }
for ((index, item) in collection.withIndex()) { }
for ((key, value) in map) { }
📌 Kotlin 的 in
操作符和 until
、step
更符合自然语言表达。
5.2. Switch 与 When
Java 中:
final int x = ...; // some value
final String xResult;
switch (x) {
case 0:
case 11:
xResult = "0 or 11";
break;
case 1:
case 2:
//...
case 10:
xResult = "from 1 to 10";
break;
default:
if(x < 12 || x > 14) {
xResult = "not from 12 to 14";
break;
}
if(isOdd(x)) {
xResult = "is odd";
break;
}
xResult = "otherwise";
}
Kotlin 中使用 when
替代 switch
:
val x = ... // some value
val xResult = when (x) {
0, 11 -> "0 or 11"
in 1..10 -> "from 1 to 10"
!in 12..14 -> "not from 12 to 14"
else -> if (isOdd(x)) { "is odd" } else { "otherwise" }
}
📌 when
可作为表达式返回值,支持范围、条件判断等,比 Java 的 switch 更灵活。
6. 类定义
Java 中定义一个类:
package com.baeldung;
public class Person {
private long id;
private String name;
private String brand;
private long price;
// setters and getters
}
Kotlin 中:
package com.baeldung
class Person {
var id: Long = 0
var name: String? = null
var brand: String? = null
var price: Long = 0
}
📌 Kotlin 自动为属性生成 getter/setter,简洁又高效。
⚠️ 注意:若要修改可见性,需手动定义 getter/setter。
7. 集合操作
Java 中:
final List<Integer> numbers = Arrays.asList(1, 2, 3);
final Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
// Java 9
final List<Integer> numbers = List.of(1, 2, 3);
final Map<Integer, String> map = Map.of(
1, "One",
2, "Two",
3, "Three");
Kotlin 中:
val numbers = listOf(1, 2, 3)
val map = mapOf(
1 to "One",
2 to "Two",
3 to "Three")
📌 Kotlin 集合 API 更简洁,支持链式调用:
numbers.forEach {
println(it)
}
numbers
.filter { it > 5 }
.forEach { println(it) }
📌 举个复杂点的例子:将数字按奇偶分组:
Java 中:
final Map<String, List<Integer>> groups = new HashMap<>();
for (int number : numbers) {
if((number & 1) == 0) {
if(!groups.containsKey("even")) {
groups.put("even", new ArrayList<>());
}
groups.get("even").add(number);
continue;
}
if(!groups.containsKey("odd")){
groups.put("odd", new ArrayList<>());
}
groups.get("odd").add(number);
}
Kotlin 中:
val groups = numbers.groupBy {
if (it and 1 == 0) "even" else "odd"
}
✅ 一行搞定,可读性极强。
8. 总结
这篇文章是 Java 开发者迁移至 Kotlin 的入门参考,涵盖了变量、控制语句、类定义、集合操作等常见迁移点。
虽然 Kotlin 的语法简洁直观,但真正掌握还需结合项目实践。后续可以深入学习 Kotlin 高级特性。
📌 一句话总结:
Kotlin = Java 的现代化升级版,更安全、更简洁、更强大。