- 函數(shù)和變量
- 函數(shù)基本結(jié)構(gòu)
fun max(a: Int,b: Int): Int { // if是表達(dá)式(有值的是表達(dá)式) return if(a>b) a else b }
- 表達(dá)式函數(shù)體
fun max(a: Int,b: Int): Int = if(a > b) a else b == fun max(a: Int,b: Int) = if(a > b) a else b
- 可便變量 val(value) 不可變引用啡彬,var(variable)可變引用
- 盡量使用 val
val message: String // 不可變引用可根據(jù)條件賦值 if (canPerformOperation()){ message = "Success" // do something }else{ message = "Failed" }
- 字符串模板
"Hello,$name" = ”Hello,${name}" "Hello,${obj.name}" "Hello, ${ if (array.size > 0) array[0] else "Guest" }" //在花括號類使用引號
- 類和屬性
- 值對象
public class Person { // java private final String name; public Person(String name) { this.name = name; } public getName(){ return name; } } == class Person(val name: String) //kotlin
- 屬性
class Person( val name: String, //只讀训挡,有g(shù)etter方法 var isMarried: Boolean //可變十电,有g(shù)etter、setter方法 )
- 自定義訪問器
class Rectangle(val height: Int, var width: Int){ val isSquare: Boolean get(){ return height == width } }
- 導(dǎo)入和Java差不多,增加了kotlin的頂層函數(shù)和方法而已
- kotlin一個文件可以放多個類晒他,名字也不必和文件名對應(yīng),由于kotlin有很多小類逸贾,建議將多個小類放在一個文件
- 表示和處理選擇: 枚舉和“when”
- 枚舉類
enum class Color { RED,ORANGE,BLUE} // enum 在class前面才是關(guān)鍵字陨仅,所以可做變量名 enum class Color( val r: Int, val g: Int , val b: Int){ RED(255,0,0),ORANGE(255,165,0); //kotlin唯一必須使用分好的地方,在枚舉類中將屬性和方法分隔開 fun rgb() = (r * 265 +g)* 265 + b }
- 用when處理枚舉類
fun getWarmth(color: Color) = when(color){ Color.RED,Color.ORANGE -> "warm" Color.BLUE -> "cold" } import package.Color.* //導(dǎo)入Color的常量 fun getWarmth(color: Color) = when(color){ RED,ORANGE -> "warm" BLUE -> "cold" }
- when中使用任意對象
fun mix(c1: Color,c2: Color) = when (setOf(c1,c2)){ setOf(RED,YELLOW) -> ORANGE setOf(BLUE,YELLOW) -> GREEN else -> throw Exception("Dirty color") } == fun mixOptimized(c1: Color,c2: Color) = when{ //when沒傳參 c1 == RED && c2 ==YELLOW || c1 == YELLOW && c2 ==RED -> ORANGE c1 == BLUE && c2 ==YELLOW || c1 == YELLOW && c2 ==BLUE -> ORANGE else -> throw Exception("Dirty color") }
- 智能轉(zhuǎn)換:
(1+2)+4 = 7 : interface Expr class Num(val value: Int): Expr class Sum(val left: Expr,val right: Expr):Expr fun eval(e: Expr) : Int = when(e){ is Num -> { // do something e.value //不用像java一樣判斷了類型還要強轉(zhuǎn) } is Sum -> eval(e.left) + eval(e.right) else -> throw IllegalArgumentException("Unknown expression") } eval(Sum(Sum(Num(1),Num(2)),Num(4))) // = 7
- 迭代
- while循環(huán)和Java一樣
- 區(qū)間:
1..10 // 1-10,閉合的區(qū)間 100 downTo 1 step 2 // 100-1的偶數(shù) 0 until size == 0...size-1 'A'..'Z' // A到Z的字符區(qū)間
- 迭代區(qū)間: for( x in 1..10)
- 迭代Map
for((key,value) in map) { value == map[key] // map[key] == map.get(key) map[key] = newVal // == map.put(key,newVal) }
- 迭代數(shù)組
for( item in list) for((index,item) in list.withIndex()) //帶下標(biāo)迭代數(shù)組
- in 運算符(可用于判斷铝侵,也可用于when表達(dá)式)
'c' in 'a'..'z' // true 底層實現(xiàn):'a' <= 'c' && 'c' <= 'z' 'c' !in '0'..'9' // false param in comparable1..comparable2 // in表達(dá)式對實現(xiàn)了comparable的所有對象有效
- 異常處理
和java的不同點:- throw結(jié)構(gòu)是一個表達(dá)式
val value = if ( number in 0..100) number else throw IllegalArgumentException("$number not in 0..100")
- kotlin不用區(qū)分受檢異常和不受檢異常灼伤,比如不用顯式處理IOException
- try做表達(dá)式
val number = try { // number = null Integer.parseInt("not a number") }catch (e: Exception){ null }