IDE 功能: 把 Java 文件转换成 Kotlin 文件
如果您使用 Android Studio 开发程序,学习 Kotlin 的最简单方法是使用 Java 语言编写单元测试,然后在Android Studio 的菜单栏中点击 Code -> Convert Java File to Kotlin File 按钮将 Java 文件转换成 Kotlin 文件。
两种语言的高阶对比
Java 与 Kotlin 在高阶角度来看是非常相似的,下面是分别使用 Java 与 Kotlin 编写的基本单元测试代码。
/// Java
public class ExampleTest {
public void testMethod1() throws Exception {}
public void testMethod2() throws Exception {}
}
/// Kotlin
class ExampleTest {
fun testMethod1() {}
fun testMethod2() {}
}
在 Kotlin 里需要注意:
方法与类的默认修饰符类型是 Public
函数定义中如果返回值是空 (void) 的话可以忽略
没有检查性异常
分号是可选项
/// C++
std::thread([this] { this->DoThreadWork(); });
/// Java
new Thread(() -> doThreadWork());
/// Kotlin
Thread { doThreadWork() }
在尾部声明类型
/// Java
int value = 10;
Entry add(String name, String description)
/// Kotlin
var value: Int = 10
fun add(name: String, description: String): Entry
/// Java
int result; // 整数型的变量,名字叫 "result"
/// Kotlin
var result: Int // 变量名字叫 "result" ,是整数型
没有 new 关键字的构造函数
/// Java
... = new SomeClass();
/// Kotlin
... = SomeClass()
起初这会让您觉得漏掉了关键信息 (指创建内存的操作),但不需要担心。因为在 Java 中,有些函数会在您不知情的情况下创建内存。对此,您从来也没有关心过 (也不需要关心)。很多函数库甚至还有创建内存的静态方法,比如:
/// Java
Lists.newArrayList();
Kotlin 只是统一了函数的这种行为。因为对一个函数来说,无论分配内存与否,这只是它的附加效果而已,并不影响函数调用。
而且它还简化了创建对象只是为了调用其方法的写法。
/// Java
new Thread(...).start(); // 有点奇怪但是是可以这样写的
/// Kotlin
Thread(...).start()
可变性与不可变性
/// Java
private final Project project; // 初始化之后无法再赋值
private Module activeModule; // 初始化之后可以再赋值
/// Kotlin
private val project: Project // 初始化之后无法再赋值
private var activeModule: Module // 初始化之后可以再赋值
/// Java
public void log(final String message) { … }
/// Kotlin
fun log(message: String) { … } // "message" is immutable
可空性
/// Java
Project project;
String title;
/// Kotlin
val project: Project?
val title: String
/// Kotlin
// 'parse' 可以返回 null,但这条用例总是能够运行
val result = parse("123")!!
// 下面这行是多余的,因为 !! 已经触发断言了
❌ assertThat(result).isNotNull()
/// Kotlin
val result = parse("...")!!
result.doSomething()
result.doSomethingElse()
/// Kotlin (自动生成)
val result = parse("...")
❌ result!!.doSomething()
❌ result!!.doSomethingElse()
可省略变量的类型
/// Java
SomeClass instance1 = new SomeClass();
SomeGeneric<List<String>> instance2 = new SomeGeneric<>();
/// Kotlin
val instance1 = SomeClass()
val instance2 = SomeGeneric<List<String ()
/// Java
BaseClass instance = new ChildClass(); // 如:List = new ArrayList
/// Kotlin
val instance: BaseClass = ChildClass()
没有检查性异常
/// Java
public void readFile() throws IOException { … }
/// Kotlin
fun readFile() { … }
/// Kotlin (从 Java 自动转换而来)
fun testSomethingImportant() { … }
/// Kotlin
fun testSomethingImportant() { … }
Lambda 调用时可以省略括号
在 Kotlin 中,如果您想要把一个闭包赋值给变量,您需要显式地声明它的类型:
val sumFunc: (Int, Int) -> Int = { x, y -> x + y }
如果所有类型是可以被推测的,则可以简写成:
{ x, y -> x + y }
举个例子:
val intList = listOf(1, 2, 3, 4, 5, 6)
val sum = intList.fold(0, { x, y -> x + y })
val sum = intList.fold(0) { x, y -> x + y }
intList.filter({ x -> x % 2 == 0 }).count()
intList.filter { x -> x % 2 == 0 }.count()
Thread({ doThreadWork() })
Thread { doThreadWork() }
equals() 方法、 == 与 === 运算符
/// Java
Color first = new Color(255, 0, 255);
Color second = new Color(255, 0, 255);
assertThat(first.equals(second)).isTrue();
assertThat(first == second).isFalse();
/// Kotlin
val first = Color(255, 0, 255)
val second = Color(255, 0, 255)
assertThat(first.equals(second)).isTrue()
assertThat(first == second).isTrue()
assertThat(first === second).isFalse()
/// Java
if (day == DayOfWeek.MONDAY) { … }
/// Kotlin (从 Java 自动转换而来)
❌ if (day === DayOfWeek.MONDAY) { … }
/// Kotlin
if (day == DayOfWeek.MONDAY) { … }
移除成员变量的前缀
/// Java
private String myName;
// 或者 private String mName;
// 或者 private String _name;
public String getName() { … }
public void setName(String name) { … }
/// Kotlin
class User {
val id: String // 代表成员变量与 getter 方法
var name: String // 代表成员变量与 getter 和 setter 方法
}
/// Kotlin (从 Java 自动转换而来)
class User {
❌ val myId: String
❌ var myName: String
}
结束语
希望本文章有助于您开始学习 Kotlin。您从编写 Java 开始,使用自动转换功能将 Java 转换成 Kotlin。这时候您会编写 Java 风格的 Kotlin 代码,随着练习,不久之后您将会像专家那样熟练地编写 Kotlin 代码了。
这篇文章只是简单介绍了 Kotlin 的使用。它的目的在于向那些没有时间学习但需要将测试用例跑起来的开发者们介绍 Kotlin 的基本概念与语法。
语言参考教程非常有用,它涵盖了 Kotlin 的所有知识点,而且难度适中。
互动教程提供了学习编程语言的平台,还包含了一系列练习题用于验证您所学到的知识点是否正确。
最后,为了将您的代码重构到 Kotlin,请点击屏末阅读原文访问我们为您准备的 Codelab —— "重构为 Kotlin",它包含了本文中介绍过的内容和其他方面的更多内容。
推荐阅读