二,Kotlin-內(nèi)置類型

1,Boolean 類型

Boolean 類型的值只有true和false ,相當(dāng)于java中的boolean和Boolean

var aBoolean: Boolean = true
var bBoolean: Boolean = false

2,Number類型

/**
 * Byte類型
 */

var abByte: Byte = 123
var bbByte: Byte = Byte.MAX_VALUE
var cbByte: Byte = Byte.MIN_VALUE


/**
 * Short類型
 */

var aShort: Short = 123
var bShort: Short = Short.MAX_VALUE
var cShort: Short = Short.MIN_VALUE


/**
 * Int類型數(shù)據(jù)寫法
 */
var anInt: Int = 100
//16進制寫法
var bInt: Int = 0xff
//二進制
var bbInt: Int = 0b00000001
var cInt: Int = Int.MAX_VALUE
var dInt: Int = Int.MIN_VALUE

/**
 * Long類型數(shù)據(jù)寫法
 */
var aLong: Long = 100
var bLong: Long = 178784932941798
var cLong: Long = Long.MAX_VALUE
var dLong: Long = Long.MIN_VALUE
//未定義整數(shù)默認是Int類型,若要使用Long類型則需要在數(shù)字后加L或l
fun main() {
    print(100L)
}

/**
 * Float類型
 */
var aFloat: Float = 1.2F
//1乘10的3次方
var bFloat: Float = 1E3f
var cFloat: Float = Float.MAX_VALUE
//Float的最小負數(shù)
var ccFloat: Float = -Float.MAX_VALUE
//Float中最小的非0正數(shù)
var dFloat: Float = Float.MIN_VALUE
//Float的最大負數(shù)
var ddFloat: Float = Float.MIN_VALUE
//不是數(shù)字的數(shù)字例如  0/0  NaN跟任何不是數(shù)的數(shù)  都不相等  因為這樣比較無意義
var eFloat: Float = Float.NaN


/**
 * Double類型
 */
var aDouble: Double = 1.0
var bDouble: Double = Double.MAX_VALUE
var cDouble: Double = Double.MIN_VALUE

Kotlin中的Int類型是Java中int和Integer的集合體,編譯器會在需要時進行裝箱和拆箱


基本數(shù)據(jù)類型的轉(zhuǎn)換,不可隱式轉(zhuǎn)換;較低位數(shù)不能直接賦值給較高位數(shù)的變量,必須通過顯示轉(zhuǎn)換才行

var ttInt: Int = 1
var ttLong: Long = ttInt.toLong();

3,Char類型

  • Char類型對應(yīng)Java中的Character類型
  • 占兩個字節(jié),標(biāo)示一個16位的 Unicode字符
  • 字符用' '(單引號)引起來
var aChar: Char = 'a'
var bChar: Char = '中'
//Unicode編碼形式
var cChar: Char = '\u000f'

轉(zhuǎn)義字符

4,字符串類型

  • 字符串是一串Char
  • 用""引起來
  • 字符串比較內(nèi)容使用==
  • 字符串比較對象是否相同使用===
/**
 * 字符串;類型
 */
var aString: String = "ABC"
var bString: String = String(charArrayOf('A', 'B', 'C'))
fun main(args: Array<String>) {
    //相當(dāng)于java中eques
    println(aString == bString)
    //判斷這兩個是不是同一個對象
    println(aString === bString)
}
//原始字符串
var cString: String = """  
     \n
     \t
     \\""
   1
     2
     3
"""

這里需要注意的是-判斷對象的引用使用"===";判斷對象的值使用"=="(相當(dāng)于Java中的equels)

5箍铲,區(qū)間(Range)

  • 數(shù)學(xué)上的概念,表示范圍
  • CloseRange 的子類 最常用的是IntRange
//離散型區(qū)間
val rangeA: IntRange = 0..10//[0,100]閉區(qū)間
val rangeB: IntRange = 0 until 10//[0,99)半開區(qū)間
var rangeC: IntProgression = 10 downTo 0//倒序閉區(qū)間和..的值順序相反
var rangeD = 1..10 step 2//步長,相當(dāng)于隔多少值再取1,3,5
var rangeE = 'a'..'z' step 3

//連續(xù)性區(qū)間
var rangeF = 1.0f..2.0f
//var rangeG = 1.0f until 2.0f  不可半開區(qū)間
//var rangeK = 1.0f..2.0f step 0.2   不可加步長,沒有意義

//無符號區(qū)間
var rangeH = 1U..10U

fun main(args: Array<String>) {
    //判斷包含關(guān)系
    println(rangeA.contains(50))
    println(50 in rangeA)
    println(rangeB.contains(100))
    println(100 in rangeB)
    //遍歷區(qū)間A
    for (i in rangeA) {
        print("$i,")
    }
    println(rangeA.joinToString())
    //遍歷區(qū)間B
    rangeB.forEach {
        print("$it")
    }
    println()
    for (i in rangeC) {
        print("$i,")
    }
    println()
    for (i in rangeD) {
        print("$i,")
    }
    println()
    rangeD.forEach {
        print("$it")
    }

}
區(qū)間的應(yīng)用
  • 遍歷數(shù)組時獲取當(dāng)前位置的索引
var arrint = intArrayOf(1, 2, 3, 4)

    //區(qū)間的應(yīng)用,獲取數(shù)組的索引
    //方式一
    for (i in 0 until arrint.size) {
        print(arrint[i])
    }
    //方式二
    for (i in arrint.indices) {
        print(arrint[i])
    }

6,數(shù)組

  • 對應(yīng)英文單詞Array
  • 跟數(shù)沒有關(guān)系,數(shù)列只是數(shù)組的一個特性形式
  • 是一系列對象

基本數(shù)據(jù)類型數(shù)組:為了避免不必要的裝箱和拆箱,基本類型的數(shù)組是定制的

//獲取數(shù)組的長度
    println(arrayOfAny.size)
    //遍歷數(shù)組
    for (i in arrayOfInt) {
        println(i)
    }
    arrayOfString.forEach { ele ->
        print(ele)
    }
    //和上面等效
    arrayOfString.forEach {
        println(it)
    }
    //判斷字符串是否在該數(shù)組中
    if ("中國" in arrayOfString) {
        println("中國在字符串中")
    }


    //數(shù)組取值并替換
    arrayOfChar[0] = 'X'
    println(arrayOfChar[0])
    //字符數(shù)組連接
    println(arrayOfChar.joinToString(""))
    //數(shù)組切片即取出數(shù)組中一個范圍內(nèi)的值
    println(arrayOfString.slice(0..1))
    println(arrayOfString.slice(0 until 2))

7,Kotlin的集合框架

  • 增加了 "不可變"集合框架接口
  • 沒有另起爐灶,復(fù)用Java Api 的所有實現(xiàn)形式
  • 提供了豐富易用的方法
//不可變list,里面元素不能增加和減少
var listA = listOf<String>("A", "b", "c")
//可變list同Java中的list相同可增刪
var ListB: MutableList<String> = mutableListOf<String>("A")
//和java中的經(jīng)典寫法兒相同
val listC = ArrayList<String>()
//map創(chuàng)建方式
val mapA = mapOf<String, Any>("name" to "wjf", "age" to 25)
var mapB = mutableMapOf<String, Any>("name" to "wjf", "age" to 25)
var mapC = mutableMapOf<String, Any>(Pair("name", "wjf"), Pair("age", 25))

fun main(args: Array<String>) {
    //正常的add添加
    for (i in 1..10) {
        listC.add("$i")
    }
    //kotlin中可以使用+=的方式來添加元素,但是listC定義的時候應(yīng)該用val不能
    //使用var要不會有編譯的錯誤
    for (i in 1..10) {
        listC += "$i"
    }
    //普通遍歷
    for (s in listC) {
        print(s)
    }
    //利用區(qū)間獲取帶索引的遍歷
    for (s in listC.indices) {
        print(listC[s])
    }
    //forEach形式
    listC.forEach {
        print(it)
    }
    //普通的移除方法
    for (i in 1..10) {
        listC.remove("$i")
    }
    for (s in listC) {
        print(s)
    }
    //-=形式移除元素
    for (i in 1..10) {
        listC -= "$i"
    }
    for (s in listC) {
        print(s)
    }
    //獲取map中的元素并賦值
    mapB["name"] = "WJF"
    //map遍歷方式1
    for (entry in mapA) {
        val key = entry.key
        val value = entry.value
        println("key is ${key}; value is $value")
    }
    //map遍歷方式2
    val asIterable = mapB.asIterable()
    for (entry in asIterable) {
        val key = entry.key
        val value = entry.value
        println("key is ${key}; value is $value")
    }
    //map遍歷方式3
    val keys = mapB.keys
    for (key in keys) {
        val value = mapB[key]
        println("key is ${key}; value is $value")
    }
    //map遍歷方式4
    for (entry in mapB.entries) {
        val key = entry.key
        val value = entry.value
        println("key is ${key}; value is $value")
    }
}
另外的一個kotlin的獨有類
  • Pair
  • Triple

8,函數(shù)(function)

<1>基本定義
  • 函數(shù):以特定功能組織起來的代碼塊
  • 函數(shù)可以有自己的類型,所以是"一等公民"
  • 可以賦值,傳遞并在合適的條件下調(diào)用

函數(shù)的定義

fun [函數(shù)名] (參數(shù)列表):[返回值類型]{[函數(shù)體]}
fun [函數(shù)名](參數(shù)列表)=[表達式]
//匿名函數(shù),需要使用變量或常量進行接收
var|val [變量名]=fun([參數(shù)列表]):返回值類型{[函數(shù)體]}
  • 如果函數(shù)的返回值為Unit(Unit相當(dāng)于Java中的void)時可以省略,編譯器會智能的類型推導(dǎo)
fun main(args: Array<String>) {
    val arg1 = 1
    val arg2 = 2
    println(sum(arg1, arg2))
    println(sumSimple(arg1, arg2))
    println(sumDate)
    println(sumDate(arg1, arg2))
}
fun sum(arg1: Int, arg2: Int): Int {
    return arg1 + arg2
}
fun sumSimple(arg1: Int, arg2: Int) = arg1 + arg2
val sumDate = fun(arg1: Int, arg2: Int): Int {
    return arg1 + arg2
}
<2>方法和函數(shù)
  • 方法可以認為是函數(shù)的一種特殊形式
  • 簡單的理解就是定義在類中的函數(shù)就是方法
class Food {
    //方法
    fun eat() {}
}
//函數(shù)
fun eat() {}
<3>函數(shù)的類型

個人見解:當(dāng)定義完一個函數(shù)后,函數(shù)的類型也就確定了,函數(shù)的類型和基本類型如Int,String等都一樣可以是參數(shù),也可以賦值,理解的時候就把函數(shù)的類型理解為跟String一樣就行,就是寫法兒有點兒特殊

class Food {
    //方法
    fun eat() {}
}

//String  是參數(shù)類型
fun eat(arg: String) {}

//() -> Unit是參數(shù)類型:空參數(shù)并且返回值為Unit類型的函數(shù)類型
fun eat(arg: () -> Unit) {}

//Food.() -> Unit是參數(shù)類型:receiver為Food中參數(shù)并且返回值為Unit類型的函數(shù)類型
fun eat(arg: Food.() -> Unit) {}

//receiver可以當(dāng)成函數(shù)的第一個參數(shù)
fun eats(arg: (Food) -> Unit) {}//跟上個等效所以函數(shù)名不能相同
<4>函數(shù)的引用

當(dāng)定義完一個函數(shù)之后,就有了一個函數(shù)的具體實現(xiàn),就相當(dāng)于實例化了一個字符串對象,這個時候就可以拿這個函數(shù)給變量進行賦值

引用方式
  • 對于一個在一個類中的函數(shù)使用 <類名>::<方法名>
  • 對于普通的函數(shù)使用 ::<方法名>
fun eat(arg: String) {}
var a: (String) -> Unit = ::eat//eat函數(shù)的引用
//() -> Unit是參數(shù)類型:空參數(shù)并且返回值為Unit類型的函數(shù)類型
fun eatb(arg: () -> Unit) {}
var b: (() -> Unit) -> Unit = ::eatb//eatb函數(shù)的引用
//Food.() -> Unit是參數(shù)類型:receiver為Food中參數(shù)并且返回值為Unit類型的函數(shù)類型
fun eatc(arg: Food.() -> Unit) {}
var c: ((Food) -> Unit) -> Unit = ::eatc//eatc函數(shù)的引用
class Food {
    fun eat() {} //方法
}
//String  是參數(shù)類型
fun eat(arg: String) {}
fun eatU() {}
//() -> Unit是參數(shù)類型:空參數(shù)并且返回值為Unit類型的函數(shù)類型
fun eatb(arg: () -> Unit) {}
//Food.() -> Unit是參數(shù)類型:receiver為Food中參數(shù)并且返回值為Unit類型的函數(shù)類型
fun eatc(arg: Food.() -> Unit) {}
//receiver可以當(dāng)成函數(shù)的第一個參數(shù)
fun eats(arg: (Food) -> Unit) {}//跟上個等效所以函數(shù)名不能相同

fun main(args: Array<String>) {
     //普通函數(shù)調(diào)用
    eat("ABC")
    //函數(shù)引用調(diào)用
    val test: () -> Unit = ::eatU
    eatb { test }
    val test2: (Food) -> Unit = Food::eat
    eatc { test2 }
    eats(test2)
    //實例化對象后函數(shù)調(diào)用
    val food:Food=Food()
    val test3=food::eat
    eatb(test3)
}
需要注意的是當(dāng)實例化一個對象后,此實例化的對象對函數(shù)的引用,不再是(對象,函數(shù)參數(shù))->返回值類型 的形式,而是(函數(shù)參數(shù))->返回值類型
<5>變長參數(shù)
  • 函數(shù)調(diào)用時候參數(shù)的個數(shù)才能確定的函數(shù)
  • 使用vararg 修飾
fun multiParameters(vararg arg1: Int){
    print(arg1.joinToString("_"))
}

multiParameters(1,2,3,4,5)
<6>多返回值
  • 其實Kotlin中是"偽"的多返回值的,是通過Pair和Triple進行組裝實現(xiàn)的
fun multiReturn(): Triple<Long, String, Int> {
    return Triple(1L, "WJF", 25)
}

val tt: Triple<Long, String, Int> = multiReturn()
//解構(gòu)
val (a, b, c) = multiReturn()
<7>函數(shù)的默認參數(shù)
  • 當(dāng)一個函數(shù)調(diào)用時,其中一個參數(shù)大多數(shù)場景下為一個值時,可以為其定一個默認值
  • 需要注意的是一般默認參數(shù)要放在最后
fun defaultParameter(name:String,age:Int,sex:String="男"){}
defaultParameter("WJF",25)
<8>編寫函數(shù)的注意事項
  • 功能要單一
  • 函數(shù)名要做到顧名思義
  • 參數(shù)個數(shù)不要太多(在某些機器上會影響執(zhí)行效率)
<9>四則運算計算器實例

通過在運行窗口輸入內(nèi)容獲得簡單的四則運行結(jié)果

fun main(vararg args: String) {
    //當(dāng)輸入的字符少3個時提示用戶
    if (args.size < 3) {
        return help()
    }
    //利用函數(shù)的引用對應(yīng)操作符
    val opres = mapOf<String, (Int, Int) -> Int>(
        "+" to ::plus,
        "-" to ::jian,
        "*" to ::time,
        "/" to ::div
    )
    //從map中獲取當(dāng)前操作符對應(yīng)的函數(shù)
    val nowOp = opres[args[1]] ?: return help()
    //打印輸入內(nèi)容
    println("你輸入了:${args.joinToString(" ")}")
    //結(jié)算結(jié)果
    println("結(jié)果:${args[0]}${args[1]}${args[2]}=${nowOp(args[0].toInt(), args[2].toInt())}")
}

fun plus(arg1: Int, arg2: Int): Int {
    return arg1 + arg2
}

fun jian(arg1: Int, arg2: Int): Int {
    return arg1 - arg2
}

fun time(arg1: Int, arg2: Int): Int {
    return arg1 * arg2
}

fun div(arg1: Int, arg2: Int): Int {
    return arg1 / arg2
}

fun help() {
    println(
        """
            這是一個四則運算的小程序
            請輸入: 3*4
            得到結(jié)果:12
            """
    )
}

輸入 3 * 5
得到結(jié)果

你輸入了:3 * 5
結(jié)果:3*5=15
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鬓椭,隨后出現(xiàn)的幾起案子颠猴,更是在濱河造成了極大的恐慌关划,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘瓮,死亡現(xiàn)場離奇詭異贮折,居然都是意外死亡,警方通過查閱死者的電腦和手機资盅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門调榄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呵扛,你說我怎么就攤上這事每庆。” “怎么了择份?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵扣孟,是天一觀的道長。 經(jīng)常有香客問我荣赶,道長凤价,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任拔创,我火速辦了婚禮利诺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剩燥。我一直安慰自己慢逾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布灭红。 她就那樣靜靜地躺著侣滩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪变擒。 梳的紋絲不亂的頭發(fā)上君珠,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音娇斑,去河邊找鬼策添。 笑死,一個胖子當(dāng)著我的面吹牛毫缆,可吹牛的內(nèi)容都是我干的唯竹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼苦丁,長吁一口氣:“原來是場噩夢啊……” “哼浸颓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猾愿,失蹤者是張志新(化名)和其女友劉穎鹦聪,沒想到半個月后账阻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒂秘,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年淘太,在試婚紗的時候發(fā)現(xiàn)自己被綠了姻僧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒲牧,死狀恐怖撇贺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冰抢,我是刑警寧澤松嘶,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挎扰,受9級特大地震影響翠订,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遵倦,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一尽超、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梧躺,春花似錦似谁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至续搀,卻和暖如春塞琼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背目代。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工屈梁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榛了。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓在讶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霜大。 傳聞我的和親對象是個殘疾皇子构哺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355