1. 程式人生 > >Kotlin基礎(一)Kotlin快速入門

Kotlin基礎(一)Kotlin快速入門

語法 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
 5
val 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: String
21 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快速入門