---
# System prepended metadata

title: Kotlin
tags: [技術分享, Kotlin]

---

# Kotlin
###### tags: `技術分享` `Kotlin`
## 簡介
1. Kotlin是一種在Java虛擬機上執行的靜態型別程式語言
2. 它也可以被編譯成為 **JavaScript 原始碼**
3. 它主要是由俄羅斯聖彼得堡的 **JetBrains** 開發團隊所發展出來的程式語言
4. 雖然與 Java 語法並不相容，**但Kotlin被設計成可以和Java程式碼相互運作**，並可以重複使用如 Java 集合框架等的現有Java類別館。

>Hathibelagal 寫道，「**如果你正在為 Android 開發尋找一種替代程式語言，那麼應該試下 Kotlin。它很容易在 Android 專案中替代 Java 或者同 Java 一起使用。**」

## 歷史
2011年7月，JetBrains 推出 Kotlin 專案，這是一個面向 JVM 的新語言，它已被開發一年之久。JetBrains 負責人 Dmitry Jemerov 說，大多數語言沒有他們正在尋找的特性，但是 [Scala](https://zh.wikipedia.org/wiki/Scala) 除外。但是，他指出 Scala 的編譯時間過慢這一明顯缺陷。Kotlin 的既定目標之一是像 Java 一樣快速編譯。2012年2月，JetBrains 以 Apache 2 許可證開源此專案。

Jetbrains 希望這個新語言能夠推動 IntelliJ IDEA 的銷售。

Kotlin v1.0 於2016年2月15日發布。這被認為是第一個官方穩定版本，並且 JetBrains 已準備從該版本開始的長期向下相容性。

在 **Google I/O 2017中，Google 宣布在 Android 上為 Kotlin 提供最佳支援**。


## 程式碼開發介紹
### 印出訊息
```
print("顯示字串")
println("顯示字串並換行")
```
### 變數宣告
Kotlin宣告變數使用val及var兩種方式
>val（value）:宣告不可改變值的變數(常數)
>var（variable）:宣告可以改變值的變數
```
val va: Int = 30
var va2: Int = 30
```
### 判斷式
>注意:Kotlin「？：」運算式，也沒有switch用法。
```
//if 判斷式
val total = 'eight'
if (total == 'nine ') { 
    println("true")
}
else if (total == 'eight')
    println("true") 
else {
    println("false")
}

//取代Java程式語言的「？：」運算式
val min = if (x < y) x else y

// when 判斷式
when (total) {
    'eight' -> min = x
    'nine' -> min = y
    else -> min = 0
}

when {
    total == 'eight ' -> min = x
    total == 'nine ' -> min = y
    else -> total = 0
}

when (number) {
    1 -> println("Number is 1")
    2 -> println("Number is 2")
    3 -> {
        repeat(number) { index ->
            println("$index = print this line three times.")
        }
    }
    else -> println("Other")
}
```
### 迴圈
```
//while
var i = 0
while (i < 3) {
    print(i)
    i++
}

//do-while
do { 
    print(i)
    i++
} while (i < 3)

// For loop
for (i in 0..10) { println(i) }

// For each
(0..10).forEach { println(it) }

```

### for迴圈
#### 「範圍運算式」使用規則
1. 從 min（最小值）到 max（最大值）
    ```
    //for loop
    for([變數名稱] in [min]..[max]){}

    //for each
    ([min]..[max]).forEach {}
    ```
2. 從 min（最小值）到 max-1（最大值）
    ```
    //for loop
    for ([變數名稱] in [min] until [max]){}

    //for each
    ([變數名稱] in [min] until [max-1]).forEach {}
    ```
3. 從 min（最小值）到 max（最大值），每次增加 Y
    ```
    //for loop
    for([變數名稱] in [min]..[max] step [Y]){}

    //for each
    ([min]..[max] step [Y]).forEach {}
    ```
4. 從 max（最大值）到 min（最小值）
    ```
    //for loop
    for([變數名稱] in [max]downTo[min]){}

    //for each
    ([max]downTo[min]).forEach {}
    ```

5. 從 max（最大值）到 min（最小值），每次減少 Y
    ```
    //for loop
    for([變數名稱] in [max]downTo[min] step [Y]){}

    //for each
    ([max]downTo[min] step [Y]).forEach {}
    ```
6.   (key（鍵）, value（值）) in map
    ```
    for ((key, value) in [map]) {
        println("$key: $value")
    }
    ```
    > Loop https://kotlinlang.org/docs/tutorials/kotlin-for-py/loops.html
### 存取控制
1. public：沒有使用關鍵字的時候，預設為public，可以在應用程式任何地方使用
2. private：只能在宣告的類別或介面中使用
3. protected：比private多了可以在子類別或子介面中使用
4. [internal](https://www.jianshu.com/p/ef3cab8c9226)：只能在同一模組中使用
### Classes
1. Class
    ```
    class Person(firstName: String) { 
         val firstProperty = "First property: $name".also(::println)
         init {
            println("First initializer block that prints ${name}")
        }
    }
    ```
2. 宣告物件
    **需要注意，Kotlin 沒有關鍵字new。**
    ```
    val invoice = Invoice()

    val customer = Customer("Joe Smith")
    ```
3. 繼承
    ```
    open class Rectangle {
        open fun draw() { println("Drawing a rectangle") }
        val borderColor: String get() = "black"
    }

    class FilledRectangle : Rectangle() {
        override fun draw() {
            super.draw()
            println("Filling the rectangle")
        }

        val fillColor: String get() = super.borderColor
    }
    ```
    >classes https://kotlinlang.org/docs/reference/classes.html
## 框架
### ktor
>https://start.ktor.io/
>https://ktor.guide/
### Spring Boot 
>https://spring.io/guides/tutorials/spring-boot-kotlin/

## 參考資料:
> 
> 維基 https://zh.wikipedia.org/wiki/Kotlin 
> 
> 凌群電子報 http://www.syscom.com.tw/ePaper_New_Content.aspx?id=665&EPID=247&TableName=sgEPArticle
> 
> Kotlin: When https://medium.com/@louis383/kotlin-when-e383d642ac79
> 
> Kotlin: For-loop vs ForEach https://medium.com/@elye.project/kotlin-for-loop-vs-foreach-7eb594960333
>
>Kotlin:線上編譯器 https://try.kotlinlang.org
>
>Kotlin Koans https://kotlinlang.org/docs/tutorials/koans.html