美文网首页
Kotlin版本的WanAndroid项目实战(一):Kotli

Kotlin版本的WanAndroid项目实战(一):Kotli

作者: bug喵喵 | 来源:发表于2020-12-13 14:43 被阅读0次

    Kotlin在今年5月份获得了Android官方的支持,被指定为Android开发一级语言,一个月之内进入了编程语言排行榜的前50(。而Android Studio也有插件支持Kotlin,Kotlin可以和Java混合使用,AS中支持直接将Java和Kotlin代码互相转换,相对来讲Kotlin代码比Java简洁一些

    变量、常量、方法

    Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等,注意哦!这里是Int不是Integer,而且字符在Kotlin中属于一个特殊的数据类型。在Kotlin中声明变量的方式和Java也有一定的差别如下

    Kotlin定义常量和变量

    var name: String = "李四"//变量,可以多次赋值
    val age: Int = 24//常量
    val sex="男"//支持类型自动检测
    
    

    在Kotlin中变量和常量通过var和val区分,而且Kotlin没有分号的,没有分号的,没有分号的,(真不是在凑字数...),上面说到变量name不可为空,因为Kotlin中变量可空需要在后面加?

     var name: String ? = "李四"//
    
    

    这也就是Kotlin中防止空指针的方法,?的作用类似Java中的装箱吧(不明白装箱的自行解决)。

    Kotlin中定义方法(静态方法)

    fun test(a: Int): Unit {
    //方法用fun修饰,括号中内容为参数类型,多个参数用逗号隔开,Unit为参数类型 类似void 可以省略
    }
    
    //Kotlin中静态方法采用companion包裹
    companion object {
    
            fun getName() {
    
            }
    
            fun getStatic(string: String): String? {
                return null
            }
        }
    
    

    Kotlin中定义类(静态类)

    Kotlin中类的定义和Java差不多,不过从上面定义静态方法应该知道Kotlin中有关静态的定义和Java也是有差异的,Kotlin中静态类定义如下

    object Demo {
        ......
    //在Kotlin中静态类中的所有方法均为静态方法,而在其他类中调用静态类中的方法不能直接通过
    //`类名.方法名()`调用,调用格式如下  `类名.INSTANCE.方法名()`
    
    }
    
    

    数据之间的比较

    在Kotlin中通过==来判断值是否相等,通过===判断内存地址是否相等,下面走进第一个坑...

    方法一
    fun office() {
        val a: Int = 10000//127
        val boxedA: Int = a
        val anotherBoxedA: Int = a
        Log.e(Tag, (boxedA === anotherBoxedA).toString())//true
        Log.e(Tag, (boxedA==anotherBoxedA).toString())//true
    }
    
    

    这里定义了3个常量,且这3个常量不可为空,(就好比int类型不可以为空),boxedAanotherBoxedA值与内存地址均相等说明这2个变量是对同一个内存地址的引用


    方法二
    fun office() {
        val a: Int? = 10000//127
        val boxedA: Int? = a
        val anotherBoxedA: Int? = a
        Log.e(Tag, (boxedA === anotherBoxedA).toString())//true
        Log.e(Tag, (boxedA == anotherBoxedA).toString())//true
    }
    
    

    这里定义了3个可为空的常量(Integer对象可以为空这个能理解吧),boxedAanotherBoxedA值与内存地址均相等说明这2个变量是对同一个内存地址的引用,


    方法三
    fun office() {
        val a: Int = 10000//127
        val boxedA: Int? = a
        val anotherBoxedA: Int? = a
        Log.e(Tag, (boxedA === anotherBoxedA).toString())//-128-127为true其余为false
        Log.e(Tag, (boxedA == anotherBoxedA).toString())//true
    }
    
    

    这里一开始我是不明白的boxedAanotherBoxedA的内存地址是否相等根据a的值来确定,查了一下比较合理的解释就是JVM把[-128,127]的所有int数字全部缓存了,任何指向这个范围的对象,都不可能被另外"创建",自然不能“装箱”

    官方文档是不太合理的,它只给了1000这个数。

    数据之间的转换

    Kotlin中不能像Java一样将一个小的数据类型赋值给大的数据,精度也一样

    val b: Byte = 1 // Kotlin中数据类型支持自动检测哦
    val i: Int = b // 错误
    val z:Int=b.toInt()//正确
    
    val c : Float = 1.123F
    val d: Double = c//错误
    val d: Double = c.toDouble()//正确
    
    

    字符串操作

    Kotlin中字符串的操作处理得还是很好的不用断断续续的去用加号和双引号连接,$表示一个变量或者变量值

    fun stringStitch(){
        val mils = 100
        val sentenceOne = "if you miss the train i on"
    
        //字符串和其他类型的的数据加$号直接拼接 $mils表示常量的值而非一个字符串  
        val sentenceTwo = "hundred mils or $mils mils"
        Log.e(Tag, sentenceTwo)//打印hundred mils or 100 mils
    
        //replace直接查找替换字符串中对应的内容
        sentenceOne.replace("train", "bus")
        Log.e(Tag, sentenceOne)//打印if you miss the train i on
    
        //额  算是多段拼接吧  字符串中的表达式通过${...}表示
        Log.e(Tag, "sentenceOne is $sentenceOne ,but now sentenceOne is ${sentenceOne.replace("train", "bus")}")
        //打印sentenceOne is if you miss the train i on ,but now sentenceOne is if you miss the bus i on
    }
    
    

    区间

    和Java不同,Kotlin中舍弃了Java中for(变量初始化;循环条件;迭代语句)的结构,所以在这里先说一下区间的表示方式,Kotlin中可以用a..b表示某一个升序的区间,如果需要表示一个降序的区间采用a downTo b,此外Kotlin中区间中的数据还支持指定步长 a..b step,区间的开闭采用util表示

    fun range() {
        for (key in 1..9) {
            //打印1-9
        }
        for (key in 1..9 step 3) {
            //打印1-4-7 步长为3
        }
        for (key in 1 until 9) {
            //依然表示区间,包含开头不包含结尾,一个左闭右开的区间
        }
        for (key in 9 downTo 1) {
            //Kotlin默认只支持升序
        }
    }
    
    

    数组

    数组的创建方式包括以下两种,前面讲过Kotlin中不支持数据类型的直接转换,所以在Kotlin中数组是不可型变的,

    fun aboutArray() {
        val arrayA: Array<Int> = arrayOf(1, 2, 3)//[1,2,3]
        val arrayB = Array(3, { i -> (i + 10) * 2 })//params_one->数组长度 params_two->表达式{}为空则数组为空 默认i为0
        for (key in 0 until arrayB.size) {
            Log.e(Tag, arrayB[key].toString())
        }
        arrayA.distinct()//数组去重
        var toSet:Set<Int> = arrayA.toSet()//数组去重,并分会set集合
    }
    
    

    第一种val arrayA: Array<Int> = arrayOf(1, 2, 3)长度固定不可数据类型不可变
    第二种val arrayB = Array(3, { i -> (i + 10) * 2 })Array中的两个参数分别说明以下,3表示数组的长度,第二个参数{ i -> (i + 10) * 2 },主要在于理解后半部分,这里i的值从0开始按照(i + 10) * 2的方式变化,每次i的值自增1,则数组中类容为[20,22,24]。

    条件语句

    这个暂时好像没什么好说的,只需要注意一点Kotlin中if语句可以作为表达式来使用比如下面的示例,var value = if (a!! > b) a else b,以及区间在if语句中的运用

    fun aboutTrinityOperator() {
        //int c = 1 > 2 ? 1 : 2;  //Java中三目运算符
        @Suppress("CanBeVal")
        var a: Int? = 1
        val b = 2
        //补充一下前面没有写到的一个内容 Kotlin中将一个对象转换为数据类型使用 !! 抛出空指针(),类似Java中出箱
        var value = if (a!! > b) a else b
        //Java中写法
        if (a >= 10 || a <= 20) {
    
        }
        //结合区间的写法
        if (a in 10..20) {
    
        }
    }
    
    

    循环语句

    这个比较尴尬 Kotlin中废除了Java中for(初始值;条件;变化趋势)的规则,增加一些如下关键字

    • downTo 递减
    • step 步长 默认步长为1
    • until 左闭右开
    • 等等...

    总的来说感觉for循环在Kotlin中没有Java中好用了,不过 while循环可以代替for循环具体用法往下看吧

    fun aboutFor() {
        var arrayA: Array<Int> = arrayOf(1, 2, 3, 4, 5)
        var arrayB: Array<String> = arrayOf("a", "b", "c")
    
        //直接遍历所有元素
        for (item in arrayA) {
            //打印arrayA中所有元素
        }
    
        //遍历区间1-98  步长为3
        for (item in 1 until 99 step 3) {
            //打印 1 4 7 10 步长为3 类似 for(...;...;i=i+3){}
        }
        //遍历区间递减
        for (item in 99 downTo 1 step 2) {
            //打印99-97-95....
        }
        for (item in 10 until 1) {//无法执行  util仅仅支持升序
            Log.e(Tag, item.toString())
        }
    
        //根据数据的下标进行遍历
        for ((index, value) in arrayB.withIndex()) {
            Log.e(Tag, "the element at $index is $value")//0-3
        //打印内容如下:the element at 0 is a
        //the element at 1 is b
        //the element at 2 is c
        }
    
    }
    
    

    感觉就是foreach循环的强化版...有木有?,while和do..while循环的话差不多就不写了,上面主要是语法上的一些不同,第一次在简书上发,好紧张...

    相关文章

      网友评论

          本文标题:Kotlin版本的WanAndroid项目实战(一):Kotli

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