Kotlin搞起来——1.介绍,实际使用,建议与相关配置


1.Kotlin简介


本节内容如图所述:
Kotlin是由**JetBrains**公司(开发了最好的Java IDE:**IntelliJ IDEA** )设计开发并

开源的基于JVM的新的编程语言,有些类似于iOS中的swift,使用Kotlin会使我们的
程序变得更加简洁,安全,让我们可以在低版本JDK中使用Java 8的一些新特性,新增的
一些新特性如下:(摘自:Kotlin: Java 6 废土中的一线希望)

  • Lambda表达式
  • 数据类 (Data classes)
  • 函数字面量和内联函数(Function literals & inline functions)
  • 函数扩展 (Extension functions)
  • 空安全(Null safety)
  • 智能转换(Smart casts)
  • 字符串模板(String templates)
  • 主构造函数(Primary constructors)
  • 类委托(Class delegation)
  • 类型推断(Type inference)
  • 单例(Singletons)
  • 声明点变量(Declaration-site variance)
  • 区间表达式(Range expressions)

这里我不会针对每个特性进行讲解,我的想法是讲解一些基础的东西,然后你一点点
加到项目当中,等写熟练了,你再回头看这些特性,也就知根知底了!


2.谈谈加到自己项目中的情况与感受


很久之前就听说过Kotlin,群里也有一位朋友用过,每次他截图发的代码都看不懂,

总觉得很高深莫测,牛逼哄哄,一直想抽时间研究下,但是迫于工作原因,
一直都是挂在嘴边。前段时间工作稍微闲暇了一点,就捣鼓着准备重构自己
手头的商城。毕竟有离开我厂的打算了,待了也快一年了,有些感情,给厂
里留点什么吧(不是坑)!
之前也重构过一个电台的项目,为了让项目支持Lambda表达式,需要添加
需要添加retrolambda依赖,可能有些读者不知道Lambda表达式是什么?
简单理解:用来替代匿名内部类的一种手段,比如,你原先创建一个线程
并启动的代码可能是:

而使用Lambda表达式,你只需要一句代码:

很简洁,再写一个点击按钮事件弹出Toast的事件:

同样,很简洁,除此之外,你还可以用Lambda表达式来遍历列表:

这些都是Java 8提供的新特性,除此之外,还有函数式接口,流API等,但是
遗憾的事,即便你加入了retrolambda依赖,但Android Studio中也只是支持
函数式接口(匿名内部类替换), 你连forEach都调用不了

Tip:关于Lambad表达式更多内容可见:Java8 lambda表达式10个示例

这就是我决定引入Kotlin的的第一个原因

使用Kotlin,可以让我在AS上使用 Java 8的一些新特性

接着说下Kotlin吸引我的第二个原因

NULL安全

在实际开发中,遇到过最多的BUG莫过于:NullPointerException(空指针异常),
某个引用(变量)出现了我们没有预料到的为NULL的情况,然后引起了程序Crash
对此我们最常见的改BUG方式,就是在出现空指针的地方加上一个判空,

if(xxx != null){//执行代码}

对此,相信大部分开发者和我一样,对此都深恶痛绝,写这种判空就像
贴黄皮膏药一样,本来自己觉得写得很好看的代码格局就被破坏了,心
里肯定是不爽的,如果使用了Kotlin,就可以省略掉判空这一步,因为
Kotlin直接在源头上就限制了:

所有变量声明默认不可为空

如果你对不可为空的引用赋null值的话,编译器会直接提示错误:

而如果你想让这个变量可为空的话,需要在类型后面手动增加一个问号

编译器虽然通过了,没提示错误,但是如果你按照上面那样直接写,也是会空指针的,
同样还是需要判空:if(str != null),另外如果你做了判空的话,这个引用是会直接
转换成:不可为空的类型!!!你可能会吐槽,这和上面我们做的那种有什么
区别。其实可更简洁些,你只需要在引用后面加上一个问号,即可完成判空操作:

只有在前面的str 不为null 的情况下,才会去调后面的toString(),否则,什么都不做!
除了这个?(安全访问操作符)外,你还可以用!!操作符,强制编译器执行可空类
型引用时跳过限制检查,但是如果引用为空,还是会报空指针的哦!

相信使用了Kotlin,你程序中因为NullPointerException而引起的崩溃会少很多!

接着安利喜欢Kotlin的第三点,

代码简洁炫酷,逼格爆炸

从自己的电台项目中取一个Bean出来:

写构造方法,然后写一堆get和set方法,尽管这些不用我们写,只需按下Alt + Insert,
然后自动生成就好,如果你用Kotlin的话,你只需下面一句:

嗯,就是这么简单,构造方法,get和set等方法都会在编译的时候自动生成,如果你对此
感兴趣的话,可以用JD-GUI打开编译生成的Story.class文件,你会发现相关的方法都已
实现~,可能有些读者说:你还要慢慢敲参数,我直接右键就能生成,比你写得快,2333,

只能说你开心就好。

再举个例子,相信大部分玩家都已经从findViewById过渡到了注解阶段,比如用ButterKnife

而在Kotlin中,你只需要导入这个布局,然后直接可以用控件的id来乱嗨:

是的,如果你结合着Anko这个DSL库一起玩的话,你甚至可以写成这样:

你可能会问,有没有更加炫酷的写法,

,或者问我,你是怎么写的?
说到这里,就不得不谈我钟情于Kotlin的下一个原因了:

溜到飞起的扩展函数

不知道扩展函数是什么?没关系,基本每个人的项目中都会有一个Utils包,
在这里面丢一些常用的工具类,比如:

然后你用到的时候需要:ResourcesUtil.getScreenWidth(Context context)传参调用,
如果你用了Kotlin,你只需要建立一个放扩展函数的工具类,然后在这里写扩展函数。

然后,你发现在所有地方,你可以直接调

这里Any类型是Kotlin中所有类的父类,类似于Java中的Object类,在.前面加上一个类型,
代表的意思是,允许在这个类型中执行这个函数,比如如果改成Activity,那么在Activity
类型的类里,就可以直接用这个扩展函数,而其他非Activity类型的类则不可用!

说回控件绑定的问题,我是用的JakeWharton大神的kotterknife,只需把ButterKnife.kt
文件加入项目中,就可以直接用了:(Github地址:https://github.com/JakeWharton/kotterknife)

然后在你需要绑定控件的地方,直接:

说到这里,不知道你是不是已经有些心动了,但是你还是有一些顾虑,比如:

Kotlin的学习成本高吗和Java一起混着玩会有问题吗?”

  • 单看文档,最多一天你能看完,当然熟练掌握,还是得到项目中实践;
  • 支持互相调用,Java和Kotlin可以共存。
  • 支持一键将Java项目转换为Kotlin项目,但是,批量转是会一堆报红的,
    而且很多垃圾代码,所以我还是更倾向于自己写
  • Kotiln并不能转Java项目,至少目前转的话不支持,你只能反编译class文件,
    把里面的Java代码复制贴到你的Java项目中!

小结下上面说的喜欢Kotlin的几点

  • 可以让我在AS上使用 Java 8的一些新特性
  • NULL安全
  • 代码简洁炫酷,逼格爆炸
  • 溜到飞起的扩展函数

以过来人亲身经历告诉你,用了Kotlin后,当你写回Java的时候你会吐槽:

更多关于Kotlin的评价可见逼乎:如何评价 Kotlin 语言?


2.为AS装上Kotlin插件


打开Plugins -> Install JetBrains plugins -> 输入Kotlin,把这个装上

重启后,File -> New 看到如下情况,说明插件安装成功


3.为项目添加Kotlin依赖


这个可以不自己手动配置,当你在工程中新建一个Kotlin File的时候顶部会有:

点击进行设置

然后AS会自动帮你引入Kotlin相关的依赖!

当然,你也可自己手动添加,app层次的build.gradle添加:

apply plugin: 'kotlin-android'
main.java.srcDirs += 'src/main/kotlin'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

项目层次的build.gradle添加:

ext.kotlin_version = '1.0.4'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

4.写个简单例子体验下


先改下布局,加个简单的按钮

新建项目,然后把MainActivity.java删掉,新建一个MainActivity.kt文件,代码如下

这里为了简化Toast我特意下了个外部函数,新建了一个ViewEx.kt的文件,代码如下:

还有一点需要注意的是,直接使用id,需要在app层的gradle中加上:

apply plugin: 'kotlin-android-extensions'

不然是会报Unresolved reference:kolinx的错误的!!!

好吧,接着像普通项目一样,运行起来就可以了,运行截图:


5.Kotlin的学习资料


本节的内容主要是让大家了解Kotlin是什么,以及在实际项目中带来的便利,
另附上相关文档:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容