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