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 操作符和 untilstep 更符合自然语言表达。


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 的现代化升级版,更安全、更简洁、更强大。



原始标题:Migrating from Java to Kotlin