美文网首页Kotlin 程序设计iOS|Android.全球编程语言爱好者
一句话解决的事何必说三句,Kotlin入坑指南

一句话解决的事何必说三句,Kotlin入坑指南

作者: 罗拙呓 | 来源:发表于2017-05-22 14:11 被阅读2684次

    看到这个标题你可能觉得很奇怪,其实这里指的是Kotlin语言出色的简洁性,能比原有用Java代码实现的功能缩小三倍以上的代码量。不仅如此,这还不是Kotlin最出色的语言特性,不信你接着往下看。

    什么是Kotlin?

    Kotlin是JetBrains开发的基于JVM的语言。JetBrains是一家捷克的软件开发公司,该公司位于捷克的布拉格,研发了IntelliJ IDEA这款相对于Eclipse有较大改善的大名鼎鼎IDE产品,使用Java开发的童鞋想必也是非常了解了,还有一些其他类似产品比如,Pycharm,Clion等等,我就不打广告了[捂脸]

    而Android Studio这款官方的Android开发IDE也是基于IntelliJ开发出来的。而在今年的Google I/O大会上,Google官方承认了Kotlin作为Android开发的官方语言,所以说JetBrains与Google想必是有什么不可告人的秘密,咳咳。

    我们为什么要学Kotlin?

    下面来讲一下Kotlin和Java相比的优势是什么?

    • 更简洁:这是它重要的优点之一,可以比Java编写少得多的代码。

    • 更安全:Kotlin是空安全的,它在编译期间就会处理各种为null的情况,无需像java一样添加很多的判空代码,节约很多调试空指针异常的时间,很大程度上避免出现NullPointException。

    • 易扩展:扩展函数意味着我们不仅可以扩展我们原有写好的类,还可以扩展系统级的类,非常灵活,另外如果在类里编写扩展函数,那么只对当前类生效。

    • 函数式:Kotlin使用了很多函数式编程的概念,比如用到了lambda表达式来更方便地解决问题。

    • Kotlin Android Extensions:再也不用编写烦人的findViewById()了,如果你集成了ButterKnife,是时候删除对它的依赖了,Kotlin支持了对于View以id形式访问。

    • 不用写分号,就像你看到的上述代码一样,对于很多写过脚本语言的童鞋来说,不要写分号这一点真是节省了很多时间,对于一天写几百行几千行甚至上万行代码的童鞋们来说,相当于省了多少个分号。

    到这里有的同学想要说了,你说的这些好处确实不错,但是我之前的项目全是用java语言来写的,难不成让我推倒重来过?别急,最后我要说的一个最大的优势就是

    • 与Java语言可混合编程,也就是说我们可以继续使用原来所有用Java写的代码和库,因为两个语言之间高度互操作,想尝试的童鞋们建议可以从新的小功能小模块入手,对这些模块使用Kotlin代码进行编写,原有的稳定模块之后再逐步重构。
    • 对初学者友好,kotlin对java语言转用kotlin提供了很多便利,对于初学者来说免去很多不必要的烦恼。最贴心的是Kotlin插件支持一键由Java转Kotlin,为你之后想要重构提供了很大的便利性。

    简洁性

    我们以最基本的POJO为例

    public class User {
    private long id;
    private String name;
    public void setId(long id) {
    this. id = id;
    }
    public void setName(String name) {
    this. name=name;
    }
    public long getId() {
    return id;
    }
    public String getName() {
    return name;
    }
    }
    
    

    其实上述类里就两个字段,一个id一个name,如果拿kotlin来写的话是什么样子呢?

    data class User(var name: String, var id: String)
    

    这一句代码就够了,Kotlin会自动生成所有属性和它们的访问器,以及一些方法,例如toString方法及equals方法。

    var user = User("kotlin","123")
    

    另外如果不需要参数或者只需要一个参数时

    class User {
    var name: String? = null
    var id: String? = null
    
    constructor(name: String) {
    this.name = name
    }
    
    constructor(name: String, id: String) {
    this.name = name
    this.id = id
    }
    }
    

    空安全

    可能有的童鞋会问了,?= 是个shenmegui??

    当我们用Java写代码时,我们如果不想出现NullPointerException,我们需要在使用它之前每次去判断是否为空。而Kotlin这类空安全语言默认对象和字段不能为空,如果我们非要让一个字段或对象为空那么必须使用安全调用操作符(?)来指定。

    val user: User? = null
    toast(user.name)
    

    例如以上代码,是无法编译通过的,因为user是可能为空的,而user没对空情况做处理,所以无法编译。解决方式有两种:

    //第一种对字段进行空情况做处理,则可安全调用
    if(user != null){
        toast(user.name)
    }
    
    //第二种利用安全调用操作符,只有在user不为空时会调用user.name,否则调用toast(null)
    toast (user?.name)
    

    我们也可以给它赋一个默认值,当user为空时调用toast("kotlin")

    //Elvis操作符用法
    toast(user?.name ?: "kotlin")
    

    易扩展

    上述代码有的人会问了,为什么你的toast可以这么写?其实就是kotlin的扩展函数在起作用。

    kotlin允许我们对任何类添加方法,包括系统级的类,自定义类等等,比如我想在Context类中添加一个toast方法。
    我们新建一个kt文件(kotlin的文件后缀),在里面写上

    fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { 
        Toast.makeText(this, message, duration).show()
    }
    

    加上这句之后,你可以在所有用到context的地方调用context.toast()方法,另外如果扩展方法写到类中,那么仅在该类生效。

    这是个很有意思的特性,接下来的事情就是发挥你们的想象力了~

    函数式(Lambdas)

    举个栗子,我们在Android开发中,经常需要写的点击事件

    view.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "Click", Toast.LENGTH_SHORT).show();
        }
    })
    

    利用了之前提到的扩展函数,可以写成

    view.setOnClickListener(object : OnClickListener {
        override fun onClick(v: View) {
            toast("Click")
        }
    }
    
    

    利用lambdas表达式我们可以把上述代码优化

    view.setOnClickListener({view -> toast("Click")}}
    

    很多情况下我们并不需要用到参数View,所以左值参数也可以省略

    view.setOnClickListener({toast("Click")}}
    

    由于这个方法只有一个参数,我们可以省略这个圆括号:

    view.setOnClickListener{toast("Click")}
    

    比原来的java代码简短了5倍,并且也很容易理解。

    Kotlin Android Extention

    举个栗子,在Android中我们不可避免地要写以下这种代码

    TextView textView = findViewById(R.id.textview);
    Button button = findViewById(R.id.button);
    
    textView.setText("kotlin");
    button.setOnClickListener(...)
    
    

    或者利用ButterKnife,写如下代码

    @Bind(R.id.textview)
    TextView mTextView;
    
    @Bind(R.id.button)
    Button mButton;
    
    ...
    
    mTextView.setText("kotlin");
    
    mButton.setOnClickListener(...)
    
    

    相信不止我一个人觉得这种代码又重复又无聊,kotlin给我们提供了另外一个思路,直接利用id来绑定

    // 导入该Activity对应的布局文件
    import kotlinx.android.synthetic.main.activity_main.*
    
    ...
        //导入后,整个Activity就可以直接利用id来对View进行操作了
        // Instead of findView(R.id.textView) as TextView
        textView.setText("kotlin")
        // Instead of findView(R.id.button) as Button
        button.setOnClickListener(...)
        }
    }
    

    这样处理再也没有一点多余代码,直接利用view的id操作,简洁明了。

    导入格式:import kotlinx.android.synthetic.main.<layout>.*

    对初学者友好

    我们在由一门语言转到另一门语言时难免有所抵触,会考虑新的语言学习成本等等问题。不过对于Kotlin来说,给了掌握Java语言童鞋们转Kotlin很多便利性:

    • 在java中编写一段代码,粘贴到kotlin文件中,IDE利用黑科技将粘贴的java代码自动转换成kotlin。
    • 对于之前已经编写好的java类,我们重构不知何从下手时,kotlin提供一键转换功能

    在idea中安装kotlin插件之后,我们可以在Code下找到

    总结

    本文浅显地总结了下kotlin对比java的几个优势,对于深层次的解析会放在后面的文章,有兴趣的童鞋可以继续关注,毕竟一门语言博大精深也不是一篇文章能讲完的。相信你看到这里内心早就想体验一下kotlin的魅力了,点此开启你的kotlin之旅吧。

    参考文献

    1. Kotlin 官方文档
    2. 《Kotlin for android Developers》

    相关文章

      网友评论

      • 依弗布德甘::clap: :clap: 非常棒.帮助新手.
        罗拙呓:@依弗布德甘 谢谢关注!
      • coexist:建议多写一些关于kotlin开发android技巧的文章, 相信看的人也会不少
        罗拙呓:@coexist 已经着手开始写了:smile:
      • 开发者头条_程序员必装的App:感谢分享!已推荐到《开发者头条》:https://toutiao.io/posts/uto483 欢迎点赞支持!
        欢迎订阅《一个程序员的自我修养》https://toutiao.io/subject/35168
        罗拙呓:@开发者头条_程序员必装的App 感谢支持!
      • f1ec52a087fd:我们来谈谈怎么接入eventbus或者rxAndroid吧。语法糖Java里本身就有很多库能处理。view绑定,用LiveData也是很优雅的方式。
        罗拙呓:@notre_ami 不好意思晚上才有空,关于kotlin接入eventbus和Rx这一块我准备之后做实践性的尝试,我觉得接入起来问题也不大。关于你提到的一些开源库我觉得也是非常优秀的实现方案,我认为kotlin的优势在于它是一种站在Android开发者的角度去思考的语言,我们可以更少地去考虑要加什么样的开源库,把精力更多放在实现及优化上,毕竟原生支持比买一些装备实现来的更稳定,也更方便些。
      • 小_马_哥:大神,我刚学android不久java也只能算是刚入门,现在kotlin异军突起,我现在很疑惑是不是要放弃java把精力投入kotlin中?希望大神能指点迷津!
        梦里风吹过:@xzj123456 个人感觉java和kotlin的关系类似OC和Swift的关系,做Android必须要有Java基础,然后学kotlin你会发现记下语法之后kotlin能够很快上手,个人建议你初期项目不要用kotlin,除非跟别人一起做项目明确用到了kotlin,等感觉对Android的开发理解或者熟悉到一定程度的时候再去尝试kotlin,这个时候没明确要求的时候就优先使用kotlin.这样会好很多(我以我做iOS转swift的经验来说的),另外我也是初学安卓,做了几个简单的项目,半年了,仍然感觉安卓好多坑,有点愁.最后说一句, kotlin和swift几乎一样啊,我对kotlin真的相当期待,已经打算下个项目开始入手了.
        小_马_哥:恩,多谢楼主,以后会一直关注!
        罗拙呓:不是大神指点不了哈,只能给你个建议,目前来看Google官方承认了Android开发语言为Kotlin,说明之后对Kotlin的支持也会越来越多,而且Kotlin出来也有一两年的时间了,目前可以开始着手学习这门语言。但是如果放弃java的学习难免得不偿失,因为java语言博大精深,况且Android之前绝大多数开源库都是用java语言来写的,所以我的建议是在学好java的基础上多多关注Kotlin这门语言,精力我觉得7分放在Java上,3分放在Kotlin上即可。
      • 有博:多埋点坑
      • 小豪丶:感谢,有点动心了😬
        罗拙呓:@小豪丶 哈哈,赶紧试试吧

      本文标题:一句话解决的事何必说三句,Kotlin入坑指南

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