Kotlin与Java对比
在前面的内容里,我们已经看到了Java与Kotlin的互操作的基本方式。为了更好的认识Java与Kotlin这两门语言,我们在这里给出一些基本功能,同时使用Java与Kotlin来实现的代码实例。通过横向对比,从中我们可以看出它们的异同。
(此处可整理成表格形式)
打印日志
- Java
1. System.out.print("Java");
2. System.out.println("Java");
- Kotlin
1. print("Kotlin")
2. println("Kotlin")
其实,Kotlin中的println函数是一个内联函数,它其实就是通过封装java.lang.System类的System.out.println来实现的。
1. @kotlin.internal.InlineOnly
2. public inline fun print(message: Any?) {
3. System.out.print(message)
4. }
常量与变量
- Java
1. String name = "KotlinVSJava";
2. final String name = "KotlinVSJava";
- Kotlin
1. var name = "KotlinVSJava"
2. val name = "KotlinVSJava"
null声明
- Java
1. String otherName;
2. otherName = null;
- Kotlin
1. var otherName : String?
2. otherName = null
空判断
- Java
1. if (text != null) {
2. int length = text.length();
3. }
- Kotlin
1. text?.let {
2. val length = text.length
3. }
4. // 或者
5. val length = text?.length
在Kotlin中,我们只使用一个问号安全调用符号就省去了Java中烦人的if - null 判断。
字符串拼接
- Java
1. String firstName = "Jack";
2. String lastName = "Chen";
3. String message = "My name is: " + firstName + " " + lastName;
- Kotlin
1. val firstName = "Jack"
2. val lastName = "Chen"
3. val message = "My name is: $firstName $lastName"
Kotlin中使用$和${}(花括号里面是表达式的时候)占位符来实现字符串的拼接,这个比在Java中每次使用加号来拼接要方便许多。
换行
- Java
1. String text = "First Line\n" +
2. "Second Line\n" +
3. "Third Line";
- Kotlin
1. val text = """
2. |First Line
3. |Second Line
4. |Third Line
5. """.trimMargin()
三元表达式
- Java
1. String text = x > 5 ? "x > 5" : "x <= 5";
- Kotlin
1. val text = if (x > 5)
2. "x > 5"
3. else "x <= 5"
操作符
- java
1. final int andResult = a & b;
2. final int orResult = a | b;
3. final int xorResult = a ^ b;
4. final int rightShift = a >> 2;
5. final int leftShift = a << 2;
- Kotlin
1. val andResult = a and b
2. val orResult = a or b
3. val xorResult = a xor b
4. val rightShift = a shr 2
5. val leftShift = a shl 2
类型判断和转换(显式)
- Java
1. if (object instanceof Car) {
2. }
3. Car car = (Car) object;
- Kotlin
1. if (object is Car) {
2. }
3. var car = object as Car
类型判断和转换 (隐式)
- Java
1. if (object instanceof Car) {
2. Car car = (Car) object;
3. }
- Kotlin
1. if (object is Car) {
2. var car = object // Kotlin智能转换
3. }
Kotlin的类型系统具备一定的类型推断能力,这样也省去了不少在Java中类型转换的样板式代码。
Range区间
- Java
1. if (score >= 0 && score <= 300) { }
- Kotlin
1. if (score in 0..300) { }
更灵活的case语句
- Java
1. public String getGrade(int score) {
2. String grade;
3. switch (score) {
4. case 10:
5. case 9:
6. grade = "A";
7. break;
8. case 8:
9. case 7:
10. case 6:
11. grade = "B";
12. break;
13. case 5:
14. case 4:
15. grade = "C";
16. break;
17. case 3:
18. case 2:
19. case 1:
20. grade = "D";
21. break;
22. default:
23. grade = "E";
24. }
25. return grade;
26. }
- Kotlin
1. fun getGrade(score: Int): String {
2. var grade = when (score) {
3. 9, 10 -> "A"
4. in 6..8 -> "B"
5. 4, 5 -> "C"
6. in 1..3 -> "D"
7. else -> "E"
8. }
9. return grade
10. }
for循环
- Java
1. for (int i = 1; i <= 10 ; i++) { }
3. for (int i = 1; i < 10 ; i++) { }
5. for (int i = 10; i >= 0 ; i--) { }
7. for (int i = 1; i <= 10 ; i+=2) { }
9. for (int i = 10; i >= 0 ; i-=2) { }
11. for (String item : collection) { }
13. for (Map.Entry<String, String> entry: map.entrySet()) { }
- Kotlin
1. for (i in 1..10) { }
3. for (i in 1 until 10) { }
5. for (i in 10 downTo 0) { }
7. for (i in 1..10 step 2) { }
9. for (i in 10 downTo 1 step 2) { }
11. for (item in collection) { }
13. for ((key, value) in map) { }
更方便的集合操作
- Java
1. final List<Integer> listOfNumber = Arrays.asList(1, 2, 3, 4);
2. final Map<Integer, String> map = new HashMap<Integer, String>();
3. map.put(1, "Jack");
4. map.put(2, "Ali");
5. map.put(3, "Mindorks");
- Kotlin
1. val listOfNumber = listOf(1, 2, 3, 4)
2. val map = mapOf(1 to "Jack", 2 to "Ali", 3 to "Mindorks")
遍历
- Java
1. // Java 7
2. for (Car car : cars) {
3. System.out.println(car.speed);
4. }
6. // Java 8+
7. cars.forEach(car -> System.out.println(car.speed));
9. // Java 7
10. for (Car car : cars) {
11. if (car.speed > 100) {
12. System.out.println(car.speed);
13. }
14. }
16. // Java 8+
17. cars.stream().filter(car -> car.speed > 100).forEach(car -> System.out.println(car.speed));
- Kotlin
1. cars.forEach {
2. println(it.speed)
3. }
5. cars.filter { it.speed > 100 }
6. .forEach { println(it.speed)}
方法(函数)定义
- Java
1. void doSomething() {
2. // 实现
3. }
5. void doSomething(int... numbers) {
6. // 实现
7. }
- Kotlin
1. fun doSomething() {
2. // 实现
3. }
5. fun doSomething(vararg numbers: Int) {
6. // 实现
7. }
带返回值的方法(函数)
- Java
1. int getScore() {
2. // logic here
3. return score;
4. }
- Kotlin
1. fun getScore(): Int {
2. // logic here
3. return score
4. }
6. // 单表达式函数
7. fun getScore(): Int = score
另外,Kotlin中的函数是可以直接传入函数参数,同时可以返回一个函数类型的。
constructor 构造器
- Java
1. public class Utils {
3. private Utils() {
4. // 外部无法来调用实例化
5. }
7. public static int getScore(int value) {
8. return 2 * value;
9. }
11. }
- Kotlin
1. class Utils private constructor() {
3. companion object {
5. fun getScore(value: Int): Int {
6. return 2 * value
7. }
9. }
10. }
12. // 或者直接声明一个object对象
13. object Utils {
15. fun getScore(value: Int): Int {
16. return 2 * value
17. }
19. }
JavaBean与Kotlin数据类
这段Kotlin中的数据类的代码:
1. data class Developer(val name: String, val age: Int)
对应下面这段Java实体类的代码:
- Java
1. public final class Developer {
2. @NotNull
3. private final String name;
4. private final int age;
6. @NotNull
7. public final String getName() {
8. return this.name;
9. }
11. public final int getAge() {
12. return this.age;
13. }
15. public Developer(@NotNull String name, int age) {
16. Intrinsics.checkParameterIsNotNull(name, "name");
17. super();
18. this.name = name;
19. this.age = age;
20. }
22. @NotNull
23. public final String component1() {
24. return this.name;
25. }
27. public final int component2() {
28. return this.age;
29. }
31. @NotNull
32. public final Developer copy(@NotNull String name, int age) {
33. Intrinsics.checkParameterIsNotNull(name, "name");
34. return new Developer(name, age);
35. }
37. // $FF: synthetic method
38. // $FF: bridge method
39. @NotNull
40. public static Developer copy$default(Developer var0, String var1, int var2, int var3, Object var4) {
41. if((var3 & 1) != 0) {
42. var1 = var0.name;
43. }
45. if((var3 & 2) != 0) {
46. var2 = var0.age;
47. }
49. return var0.copy(var1, var2);
50. }
52. public String toString() {
53. return "Developer(name=" + this.name + ", age=" + this.age + ")";
54. }
56. public int hashCode() {
57. return (this.name != null?this.name.hashCode():0) * 31 + this.age;
58. }
60. public boolean equals(Object var1) {
61. if(this != var1) {
62. if(var1 instanceof Developer) {
63. Developer var2 = (Developer)var1;
64. if(Intrinsics.areEqual(this.name, var2.name) && this.age == var2.age) {
65. return true;
66. }
67. }
69. return false;
70. } else {
71. return true;
72. }
73. }
74. }
