Kotlin学习第一天(基本语法)

参考 https://kymjs.com/code/2017/02/04/01/
https://github.com/youxin11544/Kotlin-learning
https://www.jianshu.com/p/1ea733ea197d

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //1.相乘
        var  quantity = 5
        var price:Double = 20.3
        var name:String = "大米"
        Log.i("aaa","单价:$price")
        Log.i("aaa","数量:$quantity")
        Log.i("aaa","产品:$name 总计:${quantity*price}")
        //2.let空值检测,必须结合?.来使用
        var data = null
        data?.let {
            //当data不为空时执行
            Log.i("aaa","data不为空")
        }
        data?:let {
            //当data等于空时执行
            Log.i("aaa","data等于空")
        }

        getStringLength("20")
        lateinit()
    }
    //3.智能类型推测
    fun getStringLength(obj:String):Int?{
        if (obj is String){
            //obj会被系统自动转换为String类型
            return obj.length
        }
        if (obj !is String){
            //使用!is,来取反,不为String类型
        }
        //返回为空时本代码块外部的obj仍然是String类型的引用,有返回值时返回值obj为Int类型。
        return null
    }
    //4.函数的声明,关键字fun声明,名为say()的函数,接受一个String类型的参数,并返回一个String类型的值
    fun say(str:String):String{
        return str
    }
    //5.同时,在 Kotlin 中,如果像这种简单的函数,可以简写为
    fun says(str:String):String = str
    //6.如果是返回参数类型(事实上只要是编译器可以推断的类型),那么你甚至连返回类型都可以不写
    fun getInValue(value:Int) = value
    fun getLength(str: String) = str.length
    fun getStr(str: String) = str
    fun getLong(str: String) = 10L
    fun getDouble(str: String) = 10.3
    //7.可以使用默认参数来实现重载类似的功能(7.1调用say(),得到默认的字符串 "hello",7.2也可以自己传入参数say("world")来得到传入参数值)
    fun sayss(str: String = "hello"):String = str
    //8.参数非常多的时候,可以使用多行参数的写法,它们是相同的.
    fun saysss(firstName:String = "tou",lastName:String ="wei"){}
    //9.参数判断是否为空,返回true和false
    fun hasEmpty(vararg strArray: String?):Boolean{
        for (str in strArray){
            if ("".equals(str) || str == null)
                return true
        }
        return false
    }

    fun lateinit(){
        //10.常量数组int[][][] arrs = new int[3][2][1];
        val arrs = Array(3){ Array(2){IntArray(1)}}
        //11.空安全变量
        var ltstr:String = "hello"
        var ltstrs = "word"
        //12.可为空字符串变量
        var ltstrss:String?=null
        //13.val表示常量var表示变量声明
        val myname: String = "tutu"
        //14.省略类型说明
        var myage = "23"
        //15.fun表示函数
        fun getName(): String{
            return "tutu"
        }
        //16.类继承
        class UserList(): ArrayList() {}
        //17.bean实体类
        class User {
            var names: String? = null
            var ages: String? = null
        }
        //18.调用bean实体类
        val user = User()
        //赋值
        user.names = "tutu"
        user.ages = "23"
        //取值
        val namess = user.names
        val agess = user.ages
        //19.字符串拼接
        var userInfo = "name:${user.names},  age:${user.ages}"
        //输出结果:name:tutu, age:23
        //20.空判断
        //20.1  类型后面加?表示可为空
        var age: String? = "23"
        //20.2  抛出空指针异常
        val ages = age!!.toInt()
        //20.3  不做处理返回 null
        val ages1 = age?.toInt()
        //20.4  age为空返回-1
        val ages2 = age?.toInt() ?: -1
        //21.if...else与as使用相同,移除了switch,使用when替代
        //when子式可以是常量、变量、返回数值的表达式、返回Boolean值的表达式,可以替换if...else if
        val x = 7
        when (x) {
            in 1..10 -> Log.i("aaa","x在1到10之间")
            !in 10..20 -> Log.i("aaa","x在10到20之间")
            else -> Log.i("aaa","不符合条件")
        }
        // 22.for循环
        val list = ArrayList()
        //22.1递增for (int i = 0; i < list.size(); i++)
        for (i in list.indices) {
            print(list[i])
        }
        //22.2递减for (int i = list.size(); i >= 0; i--)
        for (i in list.size downTo 0) {
            print(list[i])
        }
        //22.3操作列表内的对象
        for (item in list) {
            print(item)
        }
        //22.4变种版
        list.forEach {
            print(it)
        }
        //23.1非空类型
        var a: String = "abc"
        a = null // compilation error,异常报错
        //23.2可选型(可空类型)
        var b: String? = "abc"
        b = null // ok,可以为空
        //24.Elvis安全调用操作符 ?.  该操作符可以方便调用可选型的方法或者属性,得到的返回依然是一个可选型 Int?
        var c: String? = "abc"
        val num = c?.length
        //b?.length ?: -1 和 if (b != null) b.length else -1 完全等价的。
        //25.强转的操作符 !! 能够强行调用变量的方法或者属性,而不管这个变量是否为空;如果为空就会NPE,不想陷入NPE,不要经常使用该操作符
        //26.orElse函数,和Elvis函数结合使用,灵活的处理前面的 null
        var a:String? = null
        var b = a ?: orElse {
            //处理一些逻辑以后,再返回一个可用的值
            return@orElse "s"
        }
        var a:String? = null
        var b = a ?: orElse {
            //处理一些逻辑后, 通过return 或者 throw 结束当前函数的执行
            return
        }
        //Elvis 默认只能对单个变量或表达式是否为空进行处理
        //27.guard函数为了解决多个变量需要一起判断的场量
        fun testGuard(a: String?, b: String?, c: String?){
            guard(a, b, c) ?: orElse {
                print("a,b,c都为空")
                return
            }
            print("a,b,c都不为空")
        }
    }
 }

你可能感兴趣的:(Kotlin学习第一天(基本语法))