美文网首页
Kotlin基础

Kotlin基础

作者: 海_3efc | 来源:发表于2021-06-26 13:40 被阅读0次

    本篇文字主要记录Kotlin的基本知识及与Java对比所不同之处。

    1、基础变量类型及取值范围

    • Byte 存储值范围 整数 -2^8 ~ 2^8 -1,即-128 ~ 127;
    • Short 存储值范围 整数 -2^16 ~ 2^16 -1,即-32768 ~ 32767;
    • Int 存储值范围 整数 -2^32 ~ 2^32 - 1,即-2147483648 ~ 2147483647;
    • Long 存储值范围 整数 -2^64 ~ 2^64 - 1,即-9223372036854775808 ~ 9223372036854775807;
    • Float 存储值范围 小数,小数点后可精确到6位;
    • Double 存储值范围 小数,小数点后可精确到15 ~ 16位;
    • String 存储值范围 字符串 用“”双引号引起来的字符串都可以存储;

    2、空值处理

    在kotlin中定义的变量都不允许为空,若想允许为空的变量需要在类型后面加"?",如:var str:String? = null

    class NullDemo {
        //参数不允许为null
        fun noneNullTest(s : String){
            println(s)
        }
    
        //参数允许为null
        fun canNullTest(s:String?){
            println(s)
        }
    }
    

    与之相关操作符有:安全调用操作符(?.)非空断言操作符(!!.)
    这两个操作符的作用:
    ?.:在调用该变量的方法时,变量为null时代码停止,否则正常调用方法;
    !!.:在调用该变量的方法时,变量为null时,仍继续执行,此时会抛空指针异常;

    //参数允许为null
    fun canNullTest(s:String?){
        println(s)
    
       //s为null,停止执行
        s?.capitalize()
       //s为null,抛异常
        s!!.capitalize()
     }
    

    3、when表达式

    a.无返回值

    /**
     * 无返回值的when表达式
     */
    fun noneReturn(type:Int){
        when(type){
            1 -> {//有多行代码
                println("这里有多行代码,加大括号")
                println("这里有多行代码,加大括号")
            }
           2 -> println("只有一行代码,不用大括号")     //只有一行代码,不用大括号
           else -> println("其他情况")
        }
     }
    
    

    b.when表达式有返回值

    /**
     * 带返回值的when表达式
     */
    fun withReturn(type:Int){
         var str = when(type){
           1 -> {//有多行代码
               println("这里有多行代码,加大括号")
               println("这里有多行代码,加大括号")
               "我是type=1时的返回值"
           }
           2 -> "我是type=2的返回值"     //只有一行代码,不用大括号
           else -> "我是其他情况的返回值"
        }
        println(str)
    }
    

    4、kotlin中的loop和Range

    • 1 .. 100 表示从1到100,区间:[1,100];
    • 1 until 100 表示从1到100,区间:[1,100),不包括100;
    • step ,步长,即下一次循环跳跃的步长
        fun loopAndRange(){
            var nums = 1 .. 16
            //会输出1 2 3 ... 16
            for (n in nums){
                println(n)
            }
            
            var nums2 = 1 until 16
            //会输出1 2,3 ... 15,不会输出16
            for (n in nums2){
                println(n)
            }
            
            //会输出1 3 5 7 9 11 13 15
            for (n in nums step 2){
                println(n)
            }
        }
    

    5、list基本使用

    针对list简单的循环

        fun myList(){
            val lists = listOf<String>("1","2","3","4")
            //简单的for循环,查询列表数据
            for (item in lists){
                println(item)
            }
        }
    

    按索引值查询list

    //按索引值查询
    fun myList2(){
        val lists = listOf<String>("1","2","3","4")
        //按位循环查询,包括索引和值
        for ((i,v) in lists.withIndex()){
            println("$i,$v")
        }
    }
    

    6、map的基本使用

    与java相同,存储的key-value键值对
    示例代码如下:

    class MapDemo {
    
        fun mapTest():Unit{
            var map = HashMap<String,String>()
            map["1"] = "hello"
            map["2"] = " "
            map["3"] = "world"
    
            //查询某个key对应的值
            println("map[\"3\"] = ${map["3"]}")
    
            //查询map中所有的键值对
            for (kv in map){
                println("key=${kv.key},value=${kv.value}")
            }
        }
    }
    

    7、函数和函数表达式

    函数写法示例代码

    class FunctionDemo {
    
        //方式一:方法定义
        fun method(){
            println("方式一:方法定义")
        }
    
        //方法二:若方法中代码仅有一行,可省略大括号,如下
        fun method2() = println("方法二:若方法中代码仅有一行")
    
        fun method3(){
            //方法三:直接在方法里面定义,函数表达式的形式
            var i = {x:Int,y:Int -> x+y}
            var ret = i(1,2)
            println(ret)
    
            //方法四:是方法三的完善写法
            var j:(Int,Int)->Int = {x,y -> x+y}
            //j当做一个函数来使用
            var retJ = j(1,2)
            println(retJ)
        }
    }
    

    8、函数参数默认值和具名参数

    在kotlin中函数参数支持设置默认值

    //函数默认值
    fun area(pi:Float=3.1415f,r : Float) : Float{
        println("计算圆的周长----")
        return 2 * r * pi
    }
    

    有参数带默认值的函数的使用方式:

    • 不使用参数的默认值,通过该方式area(3.14f,10f)调用函数
    • 使用参数的默认值,则必须使用具名参数,即参数中需要设置参数的名称,如:area(r=10f),即要将值传给的那个参数的名称

    9、字符串和数字之间的转换

    数字转字符串

    var a = 30
    println(a.toString())
    
    

    字符串转数字

    var a = "30"
    val b = a.toInt()
    
    

    10、==与===比较

    Kotlin中采用==比较两个字符串是否匹配,用===比较两个变量是否指向内存堆上同一个对象(地址)。

    Java中==进行引用比较,equal进行值比较

    11、控制台输入

    从键盘输入采用:readLine()

    fun inputTest(){
        print("请输入一个数字:")
        //从键盘输入内容,赋值给num变量
        var num = readLine()
        println()
    }
    

    12、kotlin中异常处理机制

    在kotlin中异常处理机制与java相同,也是采用try...catch形式。

    class ExceptionDemo {
        //异常捕获方式
        fun exceptionTest(){
            val str = "aaa"
            try {
                var num = str.toInt()
            }catch (e:Exception){
                println("类型转换异常")
            }finally {
            }
        }
    }
    

    自定义异常,定义一个class继承自Exception,如下示例:

    class CustomException(string: String):Exception(string)
    

    13、递归中的尾递归优化

    在java中递归计算时经常碰到栈溢出问题,在kotlin中也会碰到该问题,但是可以通过关键字tailrec进行标识
    注:有tailrec关键字标识的递归函数,return地方应该也要用该递归函数

    //计算前n项求和
    //关键字tailrec是进行尾递归优化标识
    tailrec fun sum( n:Int,result:Int):Int{
        if(n == 1) {
            return result+1
        }else{
            //尾递归优化,return 值必须为递归方法,不可为:return n+sum(n-1,result)
            //否则编辑器会提示:A function is marked as tail-recursive but no tail calls are found
            return sum(n-1,result+n)
        }
    }
    

    14、空合并操作符( ?: )

    kotlin中空合并操作符(?:)的作用类似Java中的条件表达式。
    如:var str = a ?: b
    该语句的意思是:当变量a不为null时,将a赋值给str;当变量a为null时,将变量b赋值给str

    15、Double转Int

    1.转整形
    println(8.12345.toInt())
    输出:8
    2.转整形,四舍五入的方式
    println(8.62345.roundToInt())
    输出:9
    3.保留指定小数位数(会四舍五入)
    var s = "%.2f".format(8.16678)
    println(s)
    输出:8.17


    欢迎留言大家互相交流学习!


    示例源码地址kotlin_demo

    相关文章

      网友评论

          本文标题:Kotlin基础

          本文链接:https://www.haomeiwen.com/subject/gudoyltx.html