二,Kotlin-内置类型

1,Boolean 类型

Boolean 类型的值只有true和false ,相当于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类型数据写法
 */
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类型数据写法
 */
var aLong: Long = 100
var bLong: Long = 178784932941798
var cLong: Long = Long.MAX_VALUE
var dLong: Long = Long.MIN_VALUE
//未定义整数默认是Int类型,若要使用Long类型则需要在数字后加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的最小负数
var ccFloat: Float = -Float.MAX_VALUE
//Float中最小的非0正数
var dFloat: Float = Float.MIN_VALUE
//Float的最大负数
var ddFloat: Float = Float.MIN_VALUE
//不是数字的数字例如  0/0  NaN跟任何不是数的数  都不相等  因为这样比较无意义
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的集合体,编译器会在需要时进行装箱和拆箱


基本数据类型的转换,不可隐式转换;较低位数不能直接赋值给较高位数的变量,必须通过显示转换才行

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

3,Char类型

  • Char类型对应Java中的Character类型
  • 占两个字节,标示一个16位的 Unicode字符
  • 字符用' '(单引号)引起来
var aChar: Char = 'a'
var bChar: Char = '中'
//Unicode编码形式
var cChar: Char = '\u000f'

转义字符

4,字符串类型

  • 字符串是一串Char
  • 用""引起来
  • 字符串比较内容使用==
  • 字符串比较对象是否相同使用===
/**
 * 字符串;类型
 */
var aString: String = "ABC"
var bString: String = String(charArrayOf('A', 'B', 'C'))
fun main(args: Array) {
    //相当于java中eques
    println(aString == bString)
    //判断这两个是不是同一个对象
    println(aString === bString)
}
//原始字符串
var cString: String = """  
     \n
     \t
     \\""
   1
     2
     3
"""

这里需要注意的是-判断对象的引用使用"===";判断对象的值使用"=="(相当于Java中的equels)

5,区间(Range)

  • 数学上的概念,表示范围
  • CloseRange 的子类 最常用的是IntRange
//离散型区间
val rangeA: IntRange = 0..10//[0,100]闭区间
val rangeB: IntRange = 0 until 10//[0,99)半开区间
var rangeC: IntProgression = 10 downTo 0//倒序闭区间和..的值顺序相反
var rangeD = 1..10 step 2//步长,相当于隔多少值再取1,3,5
var rangeE = 'a'..'z' step 3

//连续性区间
var rangeF = 1.0f..2.0f
//var rangeG = 1.0f until 2.0f  不可半开区间
//var rangeK = 1.0f..2.0f step 0.2   不可加步长,没有意义

//无符号区间
var rangeH = 1U..10U

fun main(args: Array) {
    //判断包含关系
    println(rangeA.contains(50))
    println(50 in rangeA)
    println(rangeB.contains(100))
    println(100 in rangeB)
    //遍历区间A
    for (i in rangeA) {
        print("$i,")
    }
    println(rangeA.joinToString())
    //遍历区间B
    rangeB.forEach {
        print("$it")
    }
    println()
    for (i in rangeC) {
        print("$i,")
    }
    println()
    for (i in rangeD) {
        print("$i,")
    }
    println()
    rangeD.forEach {
        print("$it")
    }

}
区间的应用
  • 遍历数组时获取当前位置的索引
var arrint = intArrayOf(1, 2, 3, 4)

    //区间的应用,获取数组的索引
    //方式一
    for (i in 0 until arrint.size) {
        print(arrint[i])
    }
    //方式二
    for (i in arrint.indices) {
        print(arrint[i])
    }

6,数组

  • 对应英文单词Array
  • 跟数没有关系,数列只是数组的一个特性形式
  • 是一系列对象

基本数据类型数组:为了避免不必要的装箱和拆箱,基本类型的数组是定制的

//获取数组的长度
    println(arrayOfAny.size)
    //遍历数组
    for (i in arrayOfInt) {
        println(i)
    }
    arrayOfString.forEach { ele ->
        print(ele)
    }
    //和上面等效
    arrayOfString.forEach {
        println(it)
    }
    //判断字符串是否在该数组中
    if ("中国" in arrayOfString) {
        println("中国在字符串中")
    }


    //数组取值并替换
    arrayOfChar[0] = 'X'
    println(arrayOfChar[0])
    //字符数组连接
    println(arrayOfChar.joinToString(""))
    //数组切片即取出数组中一个范围内的值
    println(arrayOfString.slice(0..1))
    println(arrayOfString.slice(0 until 2))

7,Kotlin的集合框架

  • 增加了 "不可变"集合框架接口
  • 没有另起炉灶,复用Java Api 的所有实现形式
  • 提供了丰富易用的方法
//不可变list,里面元素不能增加和减少
var listA = listOf("A", "b", "c")
//可变list同Java中的list相同可增删
var ListB: MutableList = mutableListOf("A")
//和java中的经典写法儿相同
val listC = ArrayList()
//map创建方式
val mapA = mapOf("name" to "wjf", "age" to 25)
var mapB = mutableMapOf("name" to "wjf", "age" to 25)
var mapC = mutableMapOf(Pair("name", "wjf"), Pair("age", 25))

fun main(args: Array) {
    //正常的add添加
    for (i in 1..10) {
        listC.add("$i")
    }
    //kotlin中可以使用+=的方式来添加元素,但是listC定义的时候应该用val不能
    //使用var要不会有编译的错误
    for (i in 1..10) {
        listC += "$i"
    }
    //普通遍历
    for (s in listC) {
        print(s)
    }
    //利用区间获取带索引的遍历
    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,函数(function)

<1>基本定义
  • 函数:以特定功能组织起来的代码块
  • 函数可以有自己的类型,所以是"一等公民"
  • 可以赋值,传递并在合适的条件下调用

函数的定义

fun [函数名] (参数列表):[返回值类型]{[函数体]}
fun [函数名](参数列表)=[表达式]
//匿名函数,需要使用变量或常量进行接收
var|val [变量名]=fun([参数列表]):返回值类型{[函数体]}
  • 如果函数的返回值为Unit(Unit相当于Java中的void)时可以省略,编译器会智能的类型推导
fun main(args: Array) {
    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>方法和函数
  • 方法可以认为是函数的一种特殊形式
  • 简单的理解就是定义在类中的函数就是方法
class Food {
    //方法
    fun eat() {}
}
//函数
fun eat() {}
<3>函数的类型

个人见解:当定义完一个函数后,函数的类型也就确定了,函数的类型和基本类型如Int,String等都一样可以是参数,也可以赋值,理解的时候就把函数的类型理解为跟String一样就行,就是写法儿有点儿特殊

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

//String  是参数类型
fun eat(arg: String) {}

//() -> Unit是参数类型:空参数并且返回值为Unit类型的函数类型
fun eat(arg: () -> Unit) {}

//Food.() -> Unit是参数类型:receiver为Food中参数并且返回值为Unit类型的函数类型
fun eat(arg: Food.() -> Unit) {}

//receiver可以当成函数的第一个参数
fun eats(arg: (Food) -> Unit) {}//跟上个等效所以函数名不能相同
<4>函数的引用

当定义完一个函数之后,就有了一个函数的具体实现,就相当于实例化了一个字符串对象,这个时候就可以拿这个函数给变量进行赋值

引用方式
  • 对于一个在一个类中的函数使用 <类名>::<方法名>
  • 对于普通的函数使用 ::<方法名>
fun eat(arg: String) {}
var a: (String) -> Unit = ::eat//eat函数的引用
//() -> Unit是参数类型:空参数并且返回值为Unit类型的函数类型
fun eatb(arg: () -> Unit) {}
var b: (() -> Unit) -> Unit = ::eatb//eatb函数的引用
//Food.() -> Unit是参数类型:receiver为Food中参数并且返回值为Unit类型的函数类型
fun eatc(arg: Food.() -> Unit) {}
var c: ((Food) -> Unit) -> Unit = ::eatc//eatc函数的引用
class Food {
    fun eat() {} //方法
}
//String  是参数类型
fun eat(arg: String) {}
fun eatU() {}
//() -> Unit是参数类型:空参数并且返回值为Unit类型的函数类型
fun eatb(arg: () -> Unit) {}
//Food.() -> Unit是参数类型:receiver为Food中参数并且返回值为Unit类型的函数类型
fun eatc(arg: Food.() -> Unit) {}
//receiver可以当成函数的第一个参数
fun eats(arg: (Food) -> Unit) {}//跟上个等效所以函数名不能相同

fun main(args: Array) {
     //普通函数调用
    eat("ABC")
    //函数引用调用
    val test: () -> Unit = ::eatU
    eatb { test }
    val test2: (Food) -> Unit = Food::eat
    eatc { test2 }
    eats(test2)
    //实例化对象后函数调用
    val food:Food=Food()
    val test3=food::eat
    eatb(test3)
}
需要注意的是当实例化一个对象后,此实例化的对象对函数的引用,不再是(对象,函数参数)->返回值类型 的形式,而是(函数参数)->返回值类型
<5>变长参数
  • 函数调用时候参数的个数才能确定的函数
  • 使用vararg 修饰
fun multiParameters(vararg arg1: Int){
    print(arg1.joinToString("_"))
}

multiParameters(1,2,3,4,5)
<6>多返回值
  • 其实Kotlin中是"伪"的多返回值的,是通过Pair和Triple进行组装实现的
fun multiReturn(): Triple {
    return Triple(1L, "WJF", 25)
}

val tt: Triple = multiReturn()
//解构
val (a, b, c) = multiReturn()
<7>函数的默认参数
  • 当一个函数调用时,其中一个参数大多数场景下为一个值时,可以为其定一个默认值
  • 需要注意的是一般默认参数要放在最后
fun defaultParameter(name:String,age:Int,sex:String="男"){}
defaultParameter("WJF",25)
<8>编写函数的注意事项
  • 功能要单一
  • 函数名要做到顾名思义
  • 参数个数不要太多(在某些机器上会影响执行效率)
<9>四则运算计算器实例

通过在运行窗口输入内容获得简单的四则运行结果

fun main(vararg args: String) {
    //当输入的字符少3个时提示用户
    if (args.size < 3) {
        return help()
    }
    //利用函数的引用对应操作符
    val opres = mapOf Int>(
        "+" to ::plus,
        "-" to ::jian,
        "*" to ::time,
        "/" to ::div
    )
    //从map中获取当前操作符对应的函数
    val nowOp = opres[args[1]] ?: return help()
    //打印输入内容
    println("你输入了:${args.joinToString(" ")}")
    //结算结果
    println("结果:${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
            得到结果:12
            """
    )
}

输入 3 * 5
得到结果

你输入了:3 * 5
结果:3*5=15

你可能感兴趣的:(二,Kotlin-内置类型)