fun max(a: Int,b: Int): Int{ return if (a>b) a else b } println(max(1,2)) /** * Main方法 */ fun main(args: Array<String>){ println("Hello World") }
IDEA中提供這兩種函數風格之間轉換的操做
1 . 可變變量和不可變變量java
val
:不可變引用(final)var
:可變引用val
引用自身是不可變的,可是它指向的對象多是可變的var
容許變量改變本身的值,但他的類型倒是不可變的val a = "string" val a: String = "string"
fun main (args: Array<String>){ val name = if (args.size>0) args[0] else "kotlin" /** * 引用變量,若要打印$符號,則須要轉義操做 \$ */ println("Hello $name") /** * 引用表達式 */ if(args.size>0){ println("Hello ,${args[0]}") } /** * 雙引號中使用雙引號,須要保證內部的雙引號在表達式體內 */ println("Hello , ${if (args.size>0) args[0] else "kotlin"}") }
class Person(val name: String)
kotlin 中public是默認的可見性,因此省略了
2 . 屬性git
val
的屬性是隻讀的,並自動提供一個gettervar
的屬性是可變的,並自動提供一個getter和一個setterclass Person( val name: String var isMarried: Boolean ) val person = new Person("Bob",true) println(person.name)
3 . 自定義訪問器express
isSquare()
便可class Rectangle(val height: Int, val width: Int) { val isSquare: Boolean get() { return height == width } /** * 也能夠爲: * get() = height==width */ } fun main(args: Array<String>) { val rectangle = Rectangle(41, 43) println(rectangle.isSquare) }
4 . 枚舉dom
enum
關鍵字在class
前面時才表示枚舉,其餘狀況下,仍能夠當作普通名稱使用/** * 普通枚舉 */ enum class Color { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET } /** * 帶屬性值的枚舉 */ 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 main(args: Array<String>) { println(Color.BLUE.rgb()) }
5 . 接口與實現ide
:
)後面跟上接口名稱,來標記這個類實現了這個接口/** * 接口,標記接口,無任何方法 */ interface Expr /** * 實現類,使用:來標明實現哪一個接口 */ class Num(val value: Int) : Expr /** * 實現類,使用:來標明實現哪一個接口 */ class Sum(val left: Expr, val right: Expr) : Expr
6 . 類型檢查和類型轉換函數
is
來判斷一個變量是不是某種類型,在進行類型判斷後,變量會自動轉換成響應的類型,無需強制轉換,這種方式的轉換爲智能轉換,在使用智能轉換時,屬性值必須是val
屬性,並且不能有自定義的訪問器as
來顯示轉換,val n = e as Num
package
,則該文件中定義的全部聲明(類,函數,屬性)都會屬於這個包import
關鍵字,可使用*
在指定包下的全部類package geometry.shapes import java.util.Random //使用java的工具包 class Rectangle(val height: Int, val width: Int) { val isSquare: Boolean get() = height == width } fun createRandomRectangle(): Rectangle { val random = Random() return Rectangle(random.nextInt(), random.nextInt()) }
package geometry.example import geometry.shapes.createRandomRectangle //使用上面👆的對象 fun main(args: Array<String>) { println(createRandomRectangle().isSquare) }
when
1 . 枚舉中使用when
工具
when
是一個有返回值的表達式,所以能夠直接返回表達式函數體分支語句上無需使用break
code
enum class Color { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET } fun getMnemonic(color: Color) = //直接返回when表達式 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>) { println(getMnemonic(Color.BLUE)) } /** * 合併多個選項 */ fun getWarmth(color: Color) = when(color) { Color.RED, Color.ORANGE, Color.YELLOW -> "warm" Color.GREEN -> "neutral" Color.BLUE, Color.INDIGO, Color.VIOLET -> "cold" } fun main(args: Array<String>) { println(getWarmth(Color.ORANGE)) } /** * 可導入枚舉常量,從而簡化代碼 */ import ch02.colors.Color import ch02.colors.Color.* fun getWarmth(color: Color) = when(color) { RED, ORANGE, YELLOW -> "warm" GREEN -> "neutral" BLUE, INDIGO, VIOLET -> "cold" } fun main(args: Array<String>) { println(getWarmth(Color.ORANGE)) }
2 . 在when
結構中使用任意對象orm
與Java中的switch不同,可使用任意對象對象
import ch02.colors.Color import ch02.colors.Color.* fun mix(c1: Color, c2: Color) = when (setOf(c1, c2)) { //表達式匹配表達式 setOf(RED, YELLOW) -> ORANGE setOf(YELLOW, BLUE) -> GREEN setOf(BLUE, VIOLET) -> INDIGO else -> throw Exception("Dirty color") } fun main(args: Array<String>) { println(mix(BLUE, YELLOW)) }
3 . 不帶參數的when
若是沒有給when表達式提供參數,則分支條件就是任意的布爾表達式(當作if來使用)
import ch02.colors.Color import ch02.colors.Color.* fun mixOptimized(c1: Color, c2: Color) = when { (c1 == RED && c2 == YELLOW) || (c1 == YELLOW && c2 == RED) -> ORANGE (c1 == YELLOW && c2 == BLUE) || (c1 == BLUE && c2 == YELLOW) -> GREEN (c1 == BLUE && c2 == VIOLET) || (c1 == VIOLET && c2 == BLUE) -> INDIGO else -> throw Exception("Dirty color") } fun main(args: Array<String>) { println(mixOptimized(BLUE, YELLOW)) }
4 . 使用when代替if
在使用代碼塊時,代碼塊的最後一條表達式就是結果
interface Expr class Num(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr /** * 使用if */ fun eval(e: Expr): Int = if (e is Num) { e.value } else if (e is Sum) { eval(e.right) + eval(e.left) } else { throw IllegalArgumentException("Unknown expression") } /** * 使用when替換if */ fun eval(e: Expr): Int = when (e) { is Num -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") } /** * 複雜表達式體可使用{} */ fun evalWithLogging(e: Expr): Int = when (e) { is Num -> { println("num: ${e.value}") e.value } is Sum -> { val left = evalWithLogging(e.left) val right = evalWithLogging(e.right) println("sum: $left + $right") left + right } else -> throw IllegalArgumentException("Unknown expression") } fun main(args: Array<String>) { println(eval(Sum(Num(1), Num(2)))) }
5 . 迭代while
和for
循環
while
循環和Java一致區間數字
* 一個起始值,一個結束值,使用`..`運算符來表示區間`val oneToTen = 1 .. 10` * Kotlin中的區間是包含的或者閉合的,即第二個值始終是區間的一部分 * 若是能迭代區間中全部的值,這樣的區間被稱爲數列
downTo
表示降序step
表示步長,在普通區間和降序區間中都能使用until
表示開區間的結束
/** * 區間[1,100] */ for(i in 1 .. 100 ){ println(i) } /** * 區間[1,100) */ for(i in 1 until 100 ){ println(i) } /** * 區間[100,1] 降序使用downTo */ for(i in 100 downTo 1 ){ println(i) } /** * 區間[100,1? 降序,而且指定步長 */ for(i in 100 downTo 1 step 2 ){ println(i) } /** * 區間[1,100? */ for(i in 1 .. 100 step 2 ){ println(i) }
迭代Map
fun main(args: Array<String>) { val binaryReps = TreeMap<Char, String>() for (c in 'A'..'F') { val binary = Integer.toBinaryString(c.toInt()) binaryReps[c] = binary } for ((letter, binary) in binaryReps) { println("$letter = $binary") } }
使用下標迭代List
val list = arrayListOf("10","11","12") for((index,element) in list.withIndex()){ println("$index:$element") }
in
/!in
運算符,能夠檢查一個值是否在區間內,或者不在區間內when
語句中也可以使用in
`運算符in
運算符使用於全部實現java.lang.Comparable
接口的類
fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z' fun isNotDigit(c: Char) = c !in '0'..'9' fun main(args: Array<String>) { println(isLetter('q')) println(isNotDigit('x')) }
fun recognize(c: Char) = when (c) { in '0'..'9' -> "It's a digit!" in 'a'..'z', in 'A'..'Z' -> "It's a letter!" else -> "I don't know…" } fun main(args: Array<String>) { println(recognize('8')) }
Kotlin中的異常
new
關鍵字來建立實例throw
能夠做爲另外一個表達式的通常部分throws
關鍵在來拋出異常,由於Kotlin中並不區分受檢測異常和並不受檢測異常,因此在代碼中能夠處理異常,也可不處理異常try-with-resources
在kotlin中爲一個庫函數,在後面會介紹try
關鍵字和if
、when
同樣,能夠做爲表達式賦值給一個變量,但必須用花括號把語句主體包裹起來,若是主體包含多個表達式,則try
表達式的值就是最後一個表達式的值catch
語句中也須要有返回值或者直接return
import java.io.BufferedReader import java.io.StringReader fun readNumber(reader: BufferedReader): Int? { //無需throws try { val line = reader.readLine() return Integer.parseInt(line) } catch (e: NumberFormatException) { //類型在右邊 return null } finally { reader.close() } } fun main(args: Array<String>) { val reader = BufferedReader(StringReader("239")) println(readNumber(reader)) }
無finally語句
import java.io.BufferedReader import java.io.StringReader fun readNumber(reader: BufferedReader) { val number = try { Integer.parseInt(reader.readLine()) } catch (e: NumberFormatException) { return //return 中斷邏輯執行 //null //也可返回null } println(number) } fun main(args: Array<String>) { val reader = BufferedReader(StringReader("not a number")) readNumber(reader) }