Kotlin基础

本篇文字主要记录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("1","2","3","4")
        //简单的for循环,查询列表数据
        for (item in lists){
            println(item)
        }
    }

按索引值查询list

//按索引值查询
fun myList2(){
    val lists = listOf("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()
        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,kotlin,java,开发语言,android,studio,android)