美文网首页
Kotlin Android开发篇—环境搭建及基础法语

Kotlin Android开发篇—环境搭建及基础法语

作者: 刘孙猫咪 | 来源:发表于2019-04-27 12:15 被阅读0次

    Kotlin被指定为Android开发语法后很多新项目都开始采用kotlin语言进行开发了,公司之前项目的重构及新项目都打算采用kotlin进行开发,所以又不得不重新深入学习下kotlin,下面这些只是本人在学习过程中的一些笔记。

    环境搭建

    kotlin被指定为Android开发语言后,Android studio开发工具已经将kotlin内置进来了,按照相应的开发插件就可以了,相对于其他的开发环境搭建还是比较简单的,这里的开发工具是Android studio3.4版本,之前的版本稍微有点点不一样。
    打开Android studio 点击File--->Settings--->Plugins--->Marketplace,在输入框内输入kotlin,进行搜索,搜索到后找到kotlin插件点击install进行安装;

    微信截图_20190427101720.png
    安装后重启Android studio开发工具,和之前一样新建工程项目;在Language那里选择kotlin,点击finish,kotlin项目工程就建好了;整个项目的目录结构和java项目是一样的,打开app目录下的build.gradle,里面就自动引入了kotlin开发所需要的依赖和配置;
    微信截图_20190427102354.png
    如果之前是java工程,后期迭代想使用kotlin开发也是可以的,安装好插件,然后手动在app module中引入依赖和配置,还需要在项目的build.gradle进行配置; 微信截图_20190427102642.png
    配置好后,就可以进行kotlin编写了,在编写前先看下kotlin的基本语言等内容,下面一个kotlin官网和官方学习文档;
    官方网站
    官方学习文档

    基本类型

    kotlin的基本类型包括:数字、字符、布尔和数组

    数字

    kotlin提供了如下的内置类型来表示数字:


    微信截图_20190427104540.png

    注意:在kotlin中字符不是数字
    kotlin处理数字和java基本类似,但是kotlin中没有隐士转换,比如Int不能直接隐士转出成Double,而要通过调用toDouble()方法进行显示转换;


    微信截图_20190427105158.png

    通过上面这些内置方法可以进行对应的转换,kotlin中字面常量是不支持八进制,通过val关键字来定义字面常量,同时可以还可以定义一个可空的引用(Int?)或泛型,不过可空的引用或泛型会把数字装箱;

            val a:Int=100
            println(a===a)//true
            val boxA:Int?=a
            val boxB:Int?=a
            println(boxA===boxB)//false
    
            println(a==a)//true
            println(boxA==boxB)//true
    

    字符及字符串

    字符用Char表示,不能被直接当做数字,其他用法和java中差不多;
    字符串用String表示,字符串是不可变的,kotlin中提供了字符串模板,模板表达式以$开头;

            val b:Int=10
            val c:String="b=$b"//表示b=10
            val d:String="b=${b}"//表示b=10
    

    Boolean

    布尔用Boolean类型表示,分为true和false
    内置的运算符有:


    微信截图_20190427110750.png

    数组

    数组用Array表示,可以使用arrayOf()来创建一个数组,并给它传递元素,也可以通过arrayOfNulls<Int>(5)来创建一个大小指定,但是元素都为空的数组;

    //创建一个数组 并对数组进行遍历 计算
    val array=Array<Int>(5,{i: Int -> (i*i) })
    

    关于数组的遍历会在后面for或者while循环遍历讲到;

    控制流

    If表达式

    在kotlin中,if就是一个表达式,即它会返回一个值,因此普通的if就能胜任三元表达式的角色,以获取两个数中的最大值为例看下if表达式的写法:

            //写法一
            if(a>b){
                return a
            }else{
                return b
            }
    
            //写法二
            var max=a
            if(a<b) max=b
            return max
    
            //写法三
            val max=if(a>b) a else b
            return max
    
            //写法四
            val max=if(a>b){
                a
            }else{
                b
            }
            return max
    

    具体的写法有很多,就不一一写了,具体的可以根据项目的需要进行写,不过如果使用if作为表达式而不是语句,该表达式需要有else分支。

    when表达式

    kotlin中用when替换了switch,用法也比较简单:

    when(x){
                1-> println("is 1")
                2-> println("is 2")
                else -> println("is other")
            }
    

    如果在开发中每个分支的代码逻辑比较多,也可以使用{}方式将每个分支进行包裹:

    when(x){
                1-> {println("is 1")}
                2-> {println("is 2")}
                else -> {println("is other")}
            }
    

    如果碰到多分支需要同样的处理时,左边的条件那里可以写多个用,隔开:

    when(x){
                1,2-> {println("is 1 or 2")}
                3-> {println("is 3")}
                else -> {println("is other")}
            }
    

    左边的表达式不只可以是常量,还可以是方法、区间等各种方式:

    when(x){
                y.toInt()-> {println("is 1 or 2")}//y字符串通过toInt 转成Int
                in 3..5-> {println("is 3")}//in 3..5表示3到5的区间条件都成立
                else -> {println("is other")}
            }
    

    如果项目需要的话,还可以直接定义一个常量或者变量直接接受when表达式的值,从而可以直接使用when的值进行逻辑编写:

    val value=when(x){
                y.toInt()-> {println("is 1 or 2")}//y字符串通过toInt 转成Int
                in 3..5-> {println("is 3")}//in 3..5表示3到5的区间条件都成立
                else -> {println("is other")}
            }
    

    For循环

            val list= listOf<Int>(1,3,422,44)
            //第一种方式
            for(item in list){
                println("item=${item}")
            }
            //第二种方式
            for(i in list.indices){
                //i是对应的list的角标 通过list[i]的方式获取角标对应的value
               println("i=${i}item=${list[i]}")
            }
            //第三种方式
            for((i,value) in list.withIndex()){
                //i是对应list的角标 value是对应角标的value
                println("i=${i}value=${value}")
            }
    

    以上就是for循环大致的写法,当然还有其他的写法,具体可以根据需要进行编写,同时kotlin中还提供了range区间;

            for(i in 0..10){
                //表示0-10区间的遍历 闭区间
                println("i=${i}")//打印的是0到10
            }
            for(i in 0 until 10){
                //表示0-10区间的遍历 左闭右开
                println("i=${i}")//打印的是0到9
            }
            for(i in 0..10 step 2){
                //表示0-10区间的遍历 闭区间 step步数为2 类似于javafor循环中的i++
                println("i=${i}")//打印的是0 2 4 6 8 10
            }
            for(i in 10 downTo 0){
                //表示10 0区间的遍历 闭区间
                println("i=${i}")//打印的是10 9 8 7 6 5 4 3 2 1 0
            }
            for(i in 10 downTo 0 step 2){
                //表示10 0区间的遍历 闭区间
                println("i=${i}")//打印的是10 8 6  4 2  0
            }
    

    可以使用in和!in判断在或者不在该区间内;

    while和do..while循环

    while和do..while的使用和java中基本一致

            var x=100
            while (x > 0) {
                x--
                println("x=x${x}")
    
            }
            do {
                x--
                println("x=x${x}")
            }while (x>0)
    

    break、continue和return

    和java一样提供了下面三种结构化跳转表达式:

    break:种植最直接包围它的循环
    continue:继续下一次最直接包围它的循环
    return:默认从最直接包围它的函数或者匿名函数返回
    

    使用上面和java中一样,不过kotlin还提供了标签这个东西,对应单层循环或者单层函数来说没有什么区别,对于循环嵌套或者函数嵌套调用就会不一样了:

            val list= listOf<String>("aa","bb","cc","dd")
            looper@ for(i in list.indices){
                for(j in list.indices){
                    if(list[j].equals("cc")){
                        //如果等于cc 就直接跳出双层for循环 终止所有循环
                        break@looper
                    }
                }
            }
            
            loop@ for(i in list.indices){
                for(j in list.indices){
                    if(list[j].equals("cc")){
                        //如果等于cc 就直接跳过双层for循环 从最外层继续循环
                        continue@loop
                    }
                }
            }
    

    大致具体的意思在注释中写了,相比之前没有lable标签,只是跳出或者跳过对应的for循环,在有些场景下回方便不少并且可以提高循环的效率,如果在方法中添加lable标签,return的时候也会不一样哦:

    fun returnFun(){
            val list= listOf<String>("aa","bb","cc","dd")
            list.forEach lit@{  
                if(it.equals("cc")){
                    //这里返回的只是返回list.forEach 的匿名函数 并不是返回returnFun函数 
                    //list.forEach匿名函数后面的逻辑可以照样执行
                    return@lit
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:Kotlin Android开发篇—环境搭建及基础法语

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