Kotlin基礎(一)Kotlin快速入門
阿新 • • 發佈:2017-11-28
語法 note 初始 字母 文件中 create 列表 orange 快的
Kotlin快速入門
一、函數
1 /* 2 * 1.函數可以定義在文件最外層,不需要把它放在類中 3 * 2.可以省略結尾分號 4 * */ 5 fun main(args: Array<String>) { 6 println(max2(1,2)) 7 println(max(3,5)) 8 } 9 10 fun max(a: Int, b: Int): Int{ 11 return if (a>b) a else b 12 } 13 14 /* 15 * 與Java不同,Kotlin中,除了循環(for、do和do/while)16 * 以外大多數控制結構都是表達式,而不是語句(表達式和語句的區別?)。 17 * 所以可以有如下寫法。既然有了值(可推斷返回類型),就可以省略返回類型。註意,只有 18 * 表達式體函數的返回類型可以省略,對於有返回值的代碼塊體函數不可省略(這麽設計的好處?)。 19 * */ 20 fun max2(a: Int, b: Int)=if (a>b) a else b
二、變量
1 fun main(args: Array<String>) { 2 //聲明變量的三種方式 3 val a="For the Lichking!" 4 val b: Int=88 5val c=8.8e8 6 val d: String 7 d="ssss" 8 9 /* 10 * 聲明變量的關鍵字有兩個: 11 * val(來自value),不可變引用。相當於Java中的final變量。 12 * var(來自variable),可變引用(不同於Javascript,類型仍然不可變)。 13 * 相當於Java中的普通變量 14 * */ 15 16 17 /* 18 * 如果編譯器能確保只有唯一一條初始化語句被執行,可根據條件使用不同值初始化它。 19 * */ 20 val message: String21 val isTrue: Boolean=true 22 if (isTrue) message="true" else message="false" 23 }
三、字符串模板
1 fun main(args: Array<String>) { 2 //只需要在變量名前加"$"就可以在字符串字面量中引用變量 3 val name=if (args.isNotEmpty()) args[0] else "Kotlin" 4 println("Hello,${name}") 5 6 //還可以這麽玩兒 7 println("Hello,${if (args.isNotEmpty()) args[0] else "NoJava"}") 8 }
四、類
1.java類
1 public class Person { 2 private final String name; 3 4 public Person(String name){ 5 this.name=name; 6 } 7 8 public String getName() { 9 return name; 10 } 11 }
轉換為Kotlin類
1 //這種只有數據沒有其他代碼的類,通常被叫做值對象 2 class Person(val name: String)
屬性:
1 /* 2 * 在Java中,字段和其訪問器的組合叫做屬性。 3 * Kotlin的類中聲明一個變量就是聲明一個屬性。 4 * */ 5 class Man( 6 val name:String, //只讀屬性:生成字段和其getter 7 var isMarried:Boolean) //可寫屬性:生成字段和getter、setter 8 9 class Rectangle(val height: Int,val width: Int){ 10 val isSquare: Boolean 11 //自定義訪問器 12 /*get() { 13 return height==width 14 }*/ 15 16 get() = height==width 17 } 18 19 fun main(args: Array<String>) { 20 val tang=Man("Tang Jiujia",false) 21 println("My name is ${tang.name}") 22 23 val rectangle=Rectangle(22,33) 24 println(rectangle.isSquare) 25 }
五、目錄和包
1 package gemetry.shapes 2 3 import java.util.* 4 5 class Rectangle(val height:Int,val width: Int){ 6 val isSquare: Boolean 7 get() = height==width 8 } 9 10 //頂層函數 11 fun createRectangle(): Rectangle{ 12 val random = Random() 13 return Rectangle(random.nextInt(),random.nextInt()) 14 } 15 16 //Kotlin中,可以把多個類放在同一個文件中,文件的名字還可以隨意取 17 //因此可以不創建shapes文件夾,直接用shapes文件代替文件夾。 18 //當然,堅持Java的目錄文件結構仍然是個不錯的選擇 19 class RectangleUtil()
1 package gemetry.example 2 3 //可以這樣導入頂層函數,當然使用"*"時頂層函數也會被導入 4 import gemetry.shapes.createRectangle 5 6 fun main(args: Array<String>) { 7 println("Height: ${createRectangle().height}"+"\n"+"Width: ${createRectangle().width}") 8 }
六、表示和處理選擇:枚舉和when
1 package gemetry.enums 2 3 enum class Color(val r: Int,val g: Int,val b:Int){ 4 RED(255,0,0),ORANGE(255,165,0),YELLOW(255,255,0), 5 GREEN(0,255,0),BLUE(0,0,255); //這裏分號不能省略,如果要在枚舉類 6 //中定義任何方法,必須用分號把常量列表和方法分開。 7 8 //同Java一樣,可以在枚舉類中聲明屬性和方法 9 fun rgb()=(r*256+g)*256+b 10 } 11 12 fun getMc(color: Color)= 13 when (color){ 14 Color.BLUE -> "blue" 15 //不寫"break" 16 //可以多個情況一起 17 Color.GREEN,Color.RED -> "green or red" 18 //必須把所有的可能的情況都列出來,不然就用"else" 19 Color.YELLOW,Color.ORANGE ->"others" 20 } 21 22 fun mix(c1: Color,c2: Color)= 23 //與Java中的switch只能使用常量(枚舉常量、字符串、數字字面量) 24 //不同,when允許使用任何對象,任何表達式 25 when (setOf<Color>(c1,c2)){ 26 setOf(Color.RED,Color.YELLOW) -> "orange" 27 setOf(Color.YELLOW,Color.BLUE) ->"GREEN" 28 setOf(Color.BLUE,Color.RED) -> "unknow" 29 else -> "???" 30 } 31 32 fun mix2(c1: Color,c2: Color)= 33 //不帶參數的when 34 when{ 35 (c2==Color.RED && c2==Color.YELLOW) || 36 (c1==Color.YELLOW && c2==Color.RED) -> "orange" 37 else -> "others" 38 } 39 40 fun main(args: Array<String>) { 41 println(getMc(Color.ORANGE)) 42 println(mix(Color.YELLOW,Color.BLUE)) 43 println(mix2(Color.RED,Color.GREEN)) 44 }
七、智能轉換和“代碼塊最後表達式就是結果”
1 package gemetry 2 3 4 interface Expr 5 class Num(val value: Int) : Expr //實現了Expr 6 class Sum(val left: Expr,val right: Expr) : Expr 7 /* 8 fun eval(e: Expr) : Int= 9 if (e is Num) e.value 10 else if (e is Sum) eval(e.right)+ eval(e.left) 11 else throw IllegalArgumentException("Unknown expression")*/ 12 13 fun eval(e: Expr): Int= 14 //when表達式不僅限於檢查值是否相等,也可用於檢測when實參類型。 15 when(e){ 16 is Num -> e.value //"is" 判斷後自動轉換為該類型 17 // (被判斷的屬性必須是一個val屬性,而且不能有自定義訪問器) 18 is Sum -> eval(e.right) + eval(e.left) 19 else -> throw IllegalArgumentException("Unknown expression") 20 } 21 22 fun evalWithLogging(e: Expr) : Int= 23 when(e){ 24 is Num -> { 25 println("num: ${e.value}") 26 e.value //代碼快的最後一個表達式就是結果 27 /* 28 * 規則-----“代碼塊中最後的表達式就是結果”,在所有使用代碼塊並期望得到一個 29 * 結果的地方成立。但是,這個規則對常規函數不成立。一個函數要麽具有不是代碼 30 * 塊的表達式函數體,要麽具有包含顯示return語句的代碼塊函數體。 31 * */ 32 } 33 34 is Sum -> { 35 val left= evalWithLogging(e.left) 36 val right= evalWithLogging(e.right) 37 println("sum: $left+$right") 38 left+right 39 } 40 else -> { 41 throw IllegalArgumentException("Unknown Expression") 42 } 43 } 44 45 fun main(args: Array<String>) { 46 println(eval(Sum(Sum(Num(1),Num(3)),Num(3)))) 47 println(evalWithLogging(Sum(Sum(Num(1),Num(3)),Num(3)))) 48 }
八、叠代
1.when 同Java中一樣
2.for: 僅以for-each循環的形式存在 for <item> in <elements>
3.while:同Java
4.區間:為了代替Java中的普通for循環。區間本質就是值之間的間隔,這兩個值通常是數字:一個起始值,一個結束值。使用..運算符表示。
能叠其所有值的區間,叫做數列。
1 val i: Int=0 2 for (i in 1..10){ 3 println(i) 4 }
1 val i: Int=0 2 //反向叠代,步長為2 3 for (i in 20 downTo 1 step 2) println(i)
5.叠代map
1 fun main(args: Array<String>) { 2 val binaryReps=TreeMap<Char,String>() 3 4 for (c in ‘A‘..‘F‘) { //區間叠代字符 5 val binary=Integer.toBinaryString(c.toInt()) 6 binaryReps[c]=binary //根據鍵來更新map的簡明語法 7 } 8 9 for ((l,b) in binaryReps) println("$l=$b") //叠代map 10 }
6.使用in來檢查值是否在區間中
1 fun isLetter(c: Char)= c in ‘a‘..‘z‘ || c in ‘A‘..‘Z‘ 2 fun isNotDigit(c: Char)=c !in ‘0‘..‘9‘ //不在區間中
println("Kotlin" in "Java".."Scala")//字符串是按字母順序表比較 // (因為String就是這樣實現Comparable接口的)
九、異常
1.Kotlin並不區分受檢異常和非受檢異常,因此函數可以不拋出特定異常,異常可以被處理或者不處理。
2.“try”可以作為一個表達式。
Kotlin基礎(一)Kotlin快速入門