從Java到Kotlin(二)

陳子豪發表於2018-02-08

本篇文章主要對比Java跟Kotlin的基本語法在寫法上的區別。無論學習何種語言,學習它的基本語法都是第一步。

目錄

一、分號;
二、定義變數、常量
三、字串模板與字串面值
四、自動型別轉換
五、定義函式
六、註釋
七、控制流
八、集合


一、分號;

在Java中,使用分號;標誌一句完整程式碼的結束。 在Kotlin中,一句程式碼結束後不用新增分好。

二、定義變數、常量

Java定義變數時把資料型別放在前面,變數名放在後面。

int a = 1;
int b;
b = 2;
複製程式碼

Kotlin用var定義變數,把資料型別放在後面,並用冒號:隔開。

var a: Int = 1
var b: Int
b = 2
複製程式碼

Java用final定義常量,把final放在資料型別前面。

final int a = 1;
final int b;
b = 2;
複製程式碼

Kotlin用val定義常量,把資料型別放在後面,並用冒號:隔開。

val a: Int = 1
val b: Int
b = 2
複製程式碼

三、字串模板與字串面值

1.字串模板 在Kotlin中,字串可以包含模板表示式 ,即一些小段程式碼,會求值並把結果合併到字串中。 模板表示式以美元符($)開頭,由一個簡單的名字構成,如:

var a: String = "a"
var b: String = "b"
var c: String = "$a$b"
複製程式碼

上面幾行程式碼在Java中就等於

String a = "a";
String b = "b"
String c = a + b
複製程式碼

2.字串字面值 Kotlin有兩種字串面值,轉義字串和原生字串。

  • 轉義字串 轉義字串跟java字串一樣,轉義採用反斜槓方式,如:
var a: String = "a"
var b: String = "b"
Toast.makeText(this, "$a\n$b", Toast.LENGTH_SHORT).show()
複製程式碼

執行程式碼:

從Java到Kotlin(二)

  • 原生字串 原生字串可以用三個"""作為分隔符括起來,內部沒有轉義並且可以包含換行和任何其他字元:
var a: String = "a"
var b: String = "b"
var c: String = """
    $a
    $b
    """
Toast.makeText(this, c, Toast.LENGTH_SHORT).show()
複製程式碼

執行程式碼:

從Java到Kotlin(二)

可以看到前面有一段空格,這個時候可以通過trimMargin() 函式去除前導空格:

var a: String = "a"
var b: String = "b"
var c: String = """
    |$a
    $b
    """.trimMargin()
Toast.makeText(this, c, Toast.LENGTH_SHORT).show()
複製程式碼

執行程式碼:

從Java到Kotlin(二)

如上面例子所示,在需要去掉前導空格的那一行前面加上豎槓"|",再呼叫trimMargin()方法,就可以去掉前導空格。

四、自動型別轉換

Kotlin在定義變數或者常量時給他賦值,可以不指定他的型別,如:

var a = "aaa" //這裡的a是String型別
val b = 1 //這裡的b是Int型別
複製程式碼

五、定義函式

  • 無返回值無引數

Java定義無返回值無引數方法,返回型別是void

    void abc() {}
複製程式碼

Kotlin定義無返回值無引數函式,返回Unit

fun abc(): Unit{}
複製程式碼

也可以什麼都不返回

fun abc(){}
複製程式碼

可以看到Kotlin返回值的型別在函式末尾指定,並用冒號:分隔。

  • 無返回值有引數

Java定義無返回值有引數方法,返回型別是void

void abc(String str) {}
複製程式碼

Kotlin定義無返回值有引數函式,返回Unit(或不返回)

fun abc(str: String) {}
複製程式碼

括號裡的引數跟定義變數常量一樣,先指定引數名,再指定引數型別,並用冒號:分隔。

  • 有返回值有引數

Java定義有返回值有引數方法,返回型別是String

String abc(String str) {
    return "";
}
複製程式碼

Kotlin定義有返回值有引數函式,返回型別是String

fun abc(str: String): String {
    return ""
}
複製程式碼

返回值的型別在函式末尾指定,並用冒號":"分隔。

六、註釋

  • 單行註釋 Java跟Kotlin一樣 //單行註釋

  • 多行的塊註釋

Java跟Kotlin都可以這樣

/* 這是一個多行的
   塊註釋。 */
複製程式碼

Kotlin塊註釋支援巢狀,程式碼如下:

/* 
這是一個多行的
塊註釋。
    /*再巢狀一個
      塊註釋 */
*/
複製程式碼

而Java不支援塊註釋巢狀

七、控制流

1.if表示式與三元運算子

Kotlin和Java中的條件語句用法大致相同,其中不同的是Kotlin中的if語句本身就是表示式,有返回值,類似於Java的三元表示式,如下所示: Java三元表示式

c = a > b ? 3 : 4;//如果a>b,c=3,否則c=4
複製程式碼

對應的Kotlin中的if表示式

var c = if (a > b) 3 else 4
複製程式碼

如果 if 或 else 後面是程式碼塊的話

var c = if (a > b) {
    3
} else {
    4
}
複製程式碼

2.when與switch

Kotlin中沒有Java的switch語句,取而代之的是更強大的when語句,如下所示: Java中的switch語句

int a = 0;
switch (a) {
    case 0:
        break;
    case 1:
        break;
    default:
        break;
}
複製程式碼

Kotlin中對應的when語句

var a = 0
when (a) {
    0 -> {}
    1 -> {}
    else -> {}
}
複製程式碼

注意:when語句在滿足條件的分支執行後,會終止when語句執行,所以不用像switch語句那樣每一個case都加上break。 如果很多分支需要用相同的方式處理,when語句可以把多個分支條件放在一起,用逗號,分隔,如下所示:

var a = 0
when (a) {
    0 -> {}
    1,2 -> {//如果a=1或a=2,執行該程式碼塊}
    else -> {}
}
複製程式碼

when語句還能像if語句那樣作為表示式:

var a = 1
var b = when (a) {
    0 -> 0  //如果a=0,則b=0
    1 -> 1  //如果a=1,則b=1
    else -> 2 //如果a=其他,則b=2
}
複製程式碼

3.關鍵字in

當我們要判斷5是否在1-10裡面,在Java中可以這麼寫

int a = 5;
for (int i = 0; i < 10; i++) {
    if (i == a) {
        return true;
    } else {
        return false;
    }
}
複製程式碼

如果同樣的判斷用Kotlin來寫,可以用關鍵字in來判斷

if (5 in 1..10){//1..10代表1-10的意思
    return true
}else{
    return false
}
複製程式碼

4.關鍵字is

在Kotlin中可以用關鍵字is判斷物件的型別,如下所示:

fun hasPrefix(x: Any) = when(x) {//kotlin中所有類都有一個共同的父類: Any
    is String -> {//如果x是String型別,執行該程式碼塊}
    is Int -> {//如果x是Int型別,執行該程式碼塊}
    else -> false
}
複製程式碼

注意上面出現了AnyAny是Kotlin中所有類都有一個共同的父類,有點像Java中的Object,但這個類不是java.lang.Object,這個類只有equals()、 hashCode()、toString()方法。

5.for迴圈

如果你想要通過索引遍歷一個陣列或者一個list,可以使用for迴圈,如下所示: Java程式碼

for (int i = 0; i < array.size(); i++) {
    System.out.println(i);
}
複製程式碼

Kotlin程式碼

for (i in array.indices) {
    println(array[i])
}
複製程式碼

除了普通的用法之外,Kotlin的for迴圈還可以這樣:

for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
    //index是索引,value是值
}
複製程式碼

6.while 迴圈

Java跟Kotlin的while迴圈是一樣的,分為while和do...while:

var i = 0
while(i++ < 10){
}

do{
  }while(i++<10){
}
複製程式碼

八、集合

Java中的List,Set,Map:

List<Integer> integers = new ArrayList<>();
integers.add(1);
integers.add(2);
integers.add(3);
integers.remove(1);
integers.get(2);
integers.clear();

Map<String, Integer> map = new HashMap<>();
map.put("1", 1);
map.put("2", 2);
map.put("3", 3);
map.remove("1");
map.get("2");
map.clear();

Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
set.remove(1);
set.contains(2);
set.clear();
複製程式碼

Kotlin也有List,Set,Map,但Kotlin中的List,Set,Map都是不可修改的

從Java到Kotlin(二)
上圖紅色代表編譯錯誤。就是說Kotlin的List,Set,Map中沒有可以修改集合的方法,是隻讀的。當然Kotlin還提供了可以讀寫的集合,分別是MutableList,MutableSet,MutableMap,這些集合有可以修改集合的方法。

下面介紹一些Kotlin常用建立集合物件的函式: listOf:用於建立List物件

var list: List<Int> = listOf<Int>()
複製程式碼

setOf:用於建立Set物件

var set: Set<Int> = setOf<Int>()
複製程式碼

mapOf:用於建立Map物件

var map: Map<String, Int> = mapOf<String, Int>()
複製程式碼

mutableListOf:用於建立MutableListOf物件

var mutableList: MutableList<Int> = mutableListOf()
mutableList.add(1)
mutableList.add(2)
mutableList.add(3)
mutableList.remove(1)
mutableList.get(2)
mutableList.clear()
複製程式碼

mutableSetOf:用於建立MutableSetOf物件

var mutableSet: MutableSet<Int> = mutableSetOf()
mutableSet.add(1)
mutableSet.add(2)
mutableSet.add(3)
mutableSet.remove(1)
mutableSet.contains(2)
mutableSet.clear()
複製程式碼

mutableMapOf:用於建立MutableMapOf物件

var mutableMap: MutableMap<String, Int> = mutableMapOf()
mutableMap.put("1", 1)
mutableMap.put("2", 2)
mutableMap.put("3", 3)
mutableMap.remove("1")
mutableMap.get("2")
mutableMap.clear()
複製程式碼

總結

本篇文章主要對比了Java跟Kotlin的基本語法在寫法上的區別。會了基本語法,就等於踏出了從Java轉到Kotlin的第一步。

參考文獻:
Kotlin語言中文站、《Kotlin程式開發入門精要》
推薦閱讀:
從Java到Kotlin(一)為什麼使用Kotlin
從Java到Kotlin(二)基本語法
從Java到Kotlin(三)類和介面
從Java到Kotlin(四)物件與泛型
從Java到Kotlin(五)函式與Lambda表示式
從Java到Kotlin(六)擴充套件與委託
從Java到Kotlin(七)反射和註解
從Java到Kotlin(八)Kotlin的其他技術
Kotlin學習資料總彙


更多精彩文章請掃描下方二維碼關注微信公眾號"AndroidCzh":這裡將長期為您分享原創文章、Android開發經驗等! QQ交流群: 705929135

從Java到Kotlin(二)

相關文章