上一章熟悉了kotlin基本的變量和函數聲明,並明白瞭如何調用函數。本章再來看一些其餘有用的東西java
包括:dom
1. kotlin代碼組織結構ide
2. when語法函數
3. 循環迭代語法學習
4. try表達式spa
和JAVA同樣,kotlin也可使用"包"來組織代碼文件,和JAVA的語法同樣,使用package定義包,使用import導入包code
可是也有許多不一樣,例如JAVA中一般包名就對應了類文件的存放路徑,好比package cn.java.ch1下有一個User類,那麼blog
對應的Java源文件名應該叫User,位於cn/java/ch1這個文件夾下。可是kotlin沒有這個要求,文件名你能夠隨便起。字符串
文件也能夠隨便放,文件內想定義幾個類,或者是沒有類,直接定義頂級函數,都隨你。基本沒有任何限制get
同一個包下的定義的函數,屬性等能夠直接在其餘文件中使用,不一樣包的若是須要引用,則須要使用import語句,語法和JAVA同樣
經過一個例子來看一下:
package action.kotlin.ch2 import java.util.* /** * Created by user on 2017/10/9. */ class Rectangle(val height: Int, val width: Int) { val isSquare: Boolean get() = height == width } fun createRandomRectangle(): Rectangle { //使用Java的Random類,須要導包 val random = Random() return Rectangle(random.nextInt(), random.nextInt()) } fun main(args: Array<String>) { val rectangle = createRandomRectangle() val square = rectangle.isSquare println(square) }
上邊的代碼中,函數createRandomRectangle使用了Random類,須要導入java.util包
在另一個包下新建文件,內容以下:
package action.kotlin.ch2.example import action.kotlin.ch2.Rectangle /** * Created by user on 2017/10/9. */ fun main(args: Array<String>) { val rectangle = Rectangle(20, 20) println(rectangle.isSquare) }
這個文件和上邊的文件不在同一個包,所以用到另外一個包中的類時,須要使用import語句進行導入。一樣能夠導入另外一個文件的頂級函數
用法和JAVA基本是一致的。
首先建個文件,聲明一個枚舉類型,來講明when語法的使用
enum class Color(val r: Int, val g: Int, val b: Int) { RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255), INDIGO(75, 0, 130), VIOLET(238, 130, 238); //fun rgb() = (r * 256 + g) * 256 + b } fun getMnemonic(color: Color) = when (color) { Color.RED -> "Richard" Color.ORANGE -> "Of" Color.YELLOW -> "York" Color.GREEN -> "Gave" Color.BLUE -> "Battle" Color.INDIGO -> "In" Color.VIOLET -> "Vain" } fun main(args: Array<String>) { val color = getMnemonic(Color.BLUE) println(color) }
enum是關鍵字,聲明枚舉類型使用的。類名後邊的括號中是構造參數,先明白那個是構造就夠了,後續的文章中關於類的學習部分會詳細說的
這裏的意思就是聲明瞭一些枚舉值,並使用構造函數中的參數來賦值枚舉項
getMnemonic函數,須要一個Color類型的枚舉值,根據枚舉值不一樣返回不一樣的字符串給調用方
main函數調用getMnemonic函數,傳遞Color.BLUE,函數會返回對應的Battle,這裏主要看when的語法結構
when後的括號中是你要判斷的參數,when的大括號體內就是一個個的分支判斷了。因此不用when,咱們也可使用if判斷來代替。
至於箭頭語法,相信用過JDK8的應該不陌生,就是所謂的lambada表達式了。整個語法和JAVA中的switch case很像,可是明顯的區別就是when語法不須要break
若是如今我想讓參數爲Color.BLUE和或者Color.GREEN時,返回同樣的字符串,該如何作?很簡單
Color.GREEN, Color.BLUE -> "Gave"
改爲這樣便可,多個判斷分支使用逗號隔開,就是這麼簡單
去掉枚舉的類名前綴,直接使用枚舉常量:
若是不想帶Color前綴,也簡單,首先導入枚舉類。導入語句以下:
import action.kotlin.ch2.enumtest.Color.*
而後when的判斷中直接寫:
GREEN, BLUE -> "Gave"
無需再帶Color前綴了。
關於when的分支判斷,還有一些組合使用方式,這裏很少說了,之後用到會介紹
kotlin支持while和do while循環,這兩種形式的循環迭代和JAVA中的寫法沒有區別,參考JAVA的便可
kotlin中有一個名爲範圍操做符的東西。寫做:.. 兩個點,例如我想聲明一個變量,這個變量包含數字1到10,能夠以下聲明:
val oneToTen = 1 .. 10
接着可使用for,while等循環語句來迭代訪問,以for循環爲例:
for(i in oneToTen) println(i)
上邊for循環就是kotlin中for循環的語法,使用 for(var in collections)的語法來進行for迭代
kotlin提供了downTo關鍵字用來反向迭代,例子:
for(i in 100 downTo 1 step 1) print("$i ")
反向迭代一百次,每次輸出迭代的值,downTo指定從100迭代到的下限值,step指定了迭代的步階
fun main(args: Array<String>) { test(500) } fun test(percentage: Int) { if (percentage !in 0..100) { throw IllegalArgumentException( "A percentage value must be between 0 and 100: $percentage") } }
上述代碼的test函數檢測參數是否在0-100之間,若是不是拋出異常,能夠直接使用java中的異常類。語言和java也沒什麼不一樣
fun main(args: Array<String>) { val res = caculate(7, 0) println(res) } fun caculate(one: Int, two: Int): Int { var result: Int = 0 try { result = one / two } catch (e: ArithmeticException) { println("Can't be divided by Zero. $e") }finally { //do something } return result }
這個例子函數計算兩個數相除,除0引起異常,捕獲並做相應處理,和JAVA中也並無什麼不一樣,惟一的區別就是e: Exception
這裏遵循kotlin聲明變量的語法:變量名: 類型