zoukankan      html  css  js  c++  java
  • 五分钟学会 Kotlin 语法

    为什么使用Kotlin

    项目一期在收尾了终于有时间折腾了,一个多月以来Kotlin从入门到现在,坚持用来开发的切身感受。因为语法与Java的区别挺大的一开始很想放弃,如果不是因为项目在使用,想必很少人会尝试这样一门小众语言,但是习惯后会发现这些年究竟浪费多少时间在写无用的Java代码了,Kotlin在兼容Java的基础上还能大大提升开发效率。Kotlin有许多特性但对于开发来说,快速适应和学习更为重要,很多时候我们都是在不明白其原因就开始使用的,正如我们不可能把Retrofit原理研究透才使用它。只要它足够稳定成熟,并能有效的提升开发效率都是值得尝试的。鄙人不才,目前使用Kotlin的原因主要是因为它语法简洁,支持lambda表达式,强大的when语法,不用写分号结尾,光是这些就足以让我喜欢Kotlin。至于空安全之类的特性,毕竟服务端数据类型太多null了并没多大感触,这些特性在实际应用中潜移默化的就吸收了,以至于现在遇到几个Java编写的代码,都有些不适应了。

    万能的冒号

    在Kotlin中冒号:用万能来称呼绝不为过。常量变量的类型声明,函数的返回值,类的继承都需要它

    //val表示常量var表示变量声明
    val name: String = "tutu" 
    //省略类型说明
    var age = "23"
    //fun表示函数
    fun getName(): String{
       return "tutu"
    }
    //类继承
    class UserList<E>(): ArrayList<E>() {
        //...
    }

    除此之外还有一个特别的地方也需要它,使用Java类的时候。Kotlin最终会还是编译成Java字节码,使用到Java类是必然的,在Kotlin语法如下

    val intent = Intent(this, MainActivity::class.java)

    类名::class.java没有为什么就这么写记着就是

    我是谁的@

    除了冒号另一个重要符号@,想必用到内部类和匿名内部类的地方一定很多,再加上支持lambda语法,没有它谁告诉你thisreturn指的是哪一个

    class User {
        inner class State{
            fun getUser(): User{
                //返回User
                return this@User
            }
            fun getState(): State{
                //返回State
                return this@State
            }
        }
    }

    偷懒的方法

    1). Kotlin特色
    Java的getter/setter方法自动转换成属性,对应到Kotlin属性的调用

    public class User {
        private String name;
        private String age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    }

    这样一个Java类在Kotlin中只需这样调用

    val user = User()
    //赋值
    user.name = "tutu"
    user.age = "23"
    //取值
    val name = user.name
    val age = user.age

    反之Kotlin的属性自动生成Java的getter/setter方法,方便在Java中调用,同样的定义在Kotlin中

    class User {
        var name: String? = null
        var age: String? = null
    }

    我们的getter/setter方法有时不会这么简单,这就需要自定义getter/setter了,另起一行设置get()/set(value)方法,实现一个Java中常用的单例,这里只为了展示,单例在Kotlin有更简单的方法实现,只要在 package 级别创建一个 object 即可

    class User {
        companion object {
            @Volatile var instance: User? = null
                get() {
                    if (field == null) {
                        synchronized(User::class.java) {
                            if (field == null)
                                field = User()
                        }
                    }
                    return field
                }
        }
    
        var name: String? = null
        var age: String? = null
    }

    自定义getter/setter重点在field,跟我们熟悉所Java的this指代当前类一样,field指代当前参数,直接使用参数名instance代替不会报错但单例就没效果了

    2). 字符串模板
    在Java中拼接字符串的代码可读性都很差,在Kotlin字符串拼接变得非常简洁,只需用$后面加上参数名,复杂的参数要加上{}

    val user = User()
    //赋值
    user.name = "tutu"
    user.age = "23"
    //取值
    val name = user.name
    val age = user.age
    var userInfo = "name:${user.name},  age:$age"
    //输出结果:name:tutu, age:23

    3). lambda
    一开始觉得lambda很高级完全看不懂,其实很简单的就是把接口名、方法名和参数类型省掉不写再加个->罢了,明白这点了就不介绍。

    新面孔

    1). 延迟加载
    2). 流程控制
    内容上一篇写过参考 Android Kotlin 学习笔记,不重复介绍

    空判断

    Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式一种像Java一样抛出空异常,字段后加!!,另一种不做处理直接跳过,字段后加?

    //类型后面加?表示可为空
    var age: String? = "23" 
    //抛出空指针异常
    val ageInt = age!!.toInt()
    //不做处理跳过
    val ages = age?.toInt()

    注意事项

    内部类和参数默认为public,而在Java中为private
    类默认为不可继承(final),想要可被继承要声明为openabstract
    取消了static关键字,静态方法和参数统一写在companion object
    internal模块内可见,inner内部类

    以上仅是对使用频率较高的语法总结,学会基本可以阅读Kotlin代码,遇到点问题Google速查一下,至于智能转换、类型推导之类的不用说使用后喜欢自然就会了。当然这只是kotlin的基本语法,方便Java快速熟悉kotlin,深入学习还请阅读相关资料。

    相关链接

    在线学习
    Kotlin 官方文档
    Kotlin 中文文档
    Kotlin 中文文档 这个感觉像官网的中文版,翻译质量很好,不过左侧的分类没法点击,不知是不是浏览器问题,我就一个个罗列出来了
    入门
    基础
    类和对象
    函数和lambda表达式
    其他
    文档
    互操作
    FAQ
    最终找到了翻译出处kotlin-web-site-cn
    http://tanfujun.com/kotlin-web-site-cn/

  • 相关阅读:
    计算机算法设计与分析<王晓东编著> 2-5有重复元素的排列问题
    oracle 解除锁表sql
    restful
    正则表达式积累
    序列函数
    目录
    mongo 导入json数据
    mysql关于timestamp类型
    bigdecimal 保留小数位
    输出内容到文件(日志输出)
  • 原文地址:https://www.cnblogs.com/simadi/p/6688447.html
Copyright © 2011-2022 走看看