AndroidKotlin的使⽤及简单实例
Android Kotlin的使⽤及简单实例
写在前⾯的话,作为⼀个不熬夜的⼈,⼀觉醒来发现Kotlin成为了Android的官⽅语⾔,可谓是⼤喜过望。为了趁热打铁,我决定提前三天放出原定本周⽇Release的⽂章。希望能及时让⼤家了解⼀下Kotlin。
相信很多开发⼈员,尤其是Android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系。因为本篇⽂章以及博客后期的内容会涉及到很多关于Kotlin的知识分享。
在写这篇⽂章前的⼀个多⽉,Flipboard中国的Android项⽬确定了正式将Kotlin作为项⽬开发语⾔,这就意味着新增的代码⽂件将以Kotlin代码格式出现,⽽且同时旧的Java代码也将会陆陆续续翻译成Kotlin代码。在使⽤Kotlin的这段时间,被它的简洁,⾼效,快捷等等特点震撼,所以有必要写⼀篇⽂章来谈⼀谈Kotlin的特性,如若能取得推⼴Kotlin的效果则倍感欣慰。
Kotlin的“简历”
来⾃于著名的IDE IntelliJ IDEA(Android Studio基于此开发) 软件开发公司 JetBrains(位于东欧捷克)
起源来⾃JetBrains的圣彼得堡团队,名称取⾃圣彼得堡附近的⼀个⼩岛(Kotlin Island)
⼀种基于JVM的静态类型编程语⾔
来⾃知名的⼯具开发商JetBrains,也就决定了Kotlin的基因中必然包含实⽤与⾼效等特征。那我们接下来看⼀看Kotlin的特点,当然这也是我改⽤Kotlin的重要原因。
语法简单,不啰嗦
//variables and constants
var currentVersionCode = 1 //变量当前的版本号,类型Int可以根据值推断出来
var currentVersionName : String = "1.0" //显式标明类型
val APPNAME = "droidyue" //常量APPNAME 类型(String)可以根据值推断出来
//methods
fun main(args: Array<String>) {
println(args)
}
// class
class MainActivity : AppCompatActivity() {
}
// data class ⾃动⽣成getter,setting,hashcode和equals等⽅法
data class Book(var name: String, val price: Float, var author: String)
//⽀持默认参数值,减少⽅法重载
fun Context.showToast(message: String, duration:Int = Toast.LENGTH_LONG) {
Toast.makeText(this, message, duration).show()
}
1. Kotlin⽀持类型推断,没有Java那样的啰嗦。
2. 另外⽤var表⽰变量,val表⽰常量更加的简洁
3. ⽅法也很简单,连function都缩写成了fun,平添了⼏分双关之意。
4. 类的继承和实现很简单,使⽤:即可
5. Kotlin每个句⼦都不需要加分号(;)
空指针安全
空指针(NullPointerException或NPE)是我们使⽤Java开发程序中最常见的崩溃了。因为在Java中我们不得不写很多防御性的代码,⽐如这样
public void test(String string) {
if (string != null) {
char[] chars = CharArray();
if (chars.length > 10) {
System.out.println(((Character)chars[10]).hashCode());
}
}
}
在Kotlin中空指针异常得到了很好的解决。
1.在类型上的处理,即在类型后⾯加上?,即表⽰这个变量或参数以及返回值可以为null,否则不允许为变量参数赋值为null或者返回null
2.对于⼀个可能是null的变量或者参数,在调⽤对象⽅法或者属性之前,需要加上?,否则编译⽆法通过。
如下⾯的代码就是Kotlin实现空指针安全的⼀个例⼦,⽽且相对Java实现⽽⾔,简直是⼀⾏代码搞定的。
fun testNullSafeOperator(string: String?) {
System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode())
}
testNullSafeOperator(null)
testNullSafeOperator("12345678901")
testNullSafeOperator("123")
//result
null
49
null
关于空指针安全的原理,可以参考这篇⽂章研究学习Kotlin的⼀些⽅法
⽀持⽅法扩展
很多时候,Framework提供给我们的API往往都时⽐较原⼦的,调⽤时需要我们进⾏组合处理,因为就会产⽣了⼀些Util类,⼀个简单的例⼦,我们想要更快捷的展⽰Toast信息,在Java中我们可以这样做。
public static void longToast(Context context, String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
但是Kotlin的实现却让⼈惊奇,我们只需要重写扩展⽅法就可以了,⽐如这个longToast⽅法扩展到所有的Context对象中,如果不去追根溯源,可能⽆法区分是Framework提供的还是⾃⾏扩展的。
fun Context.longToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
applicationContext.longToast("hello world")
注意:Kotlin的⽅法扩展并不是真正修改了对应的类⽂件,⽽是在编译器和IDE⽅⾯做得处理。使我们看起来像是扩展了⽅法。
Lambda, ⾼阶函数,Streams API, 函数式编程⽀持
所谓的Lambda表达式是匿名函数,这使得我们的代码会更加的简单。⽐如下⾯的代码就是lambda的应⽤。
findViewById(t).setOnClickListener {
Log.d("MainActivity", "$it was clicked")
}
所谓的⾼阶函数就是
可以接受函数作为参数
也可以返回函数作为结果
举⼀个接受函数作为参数的例⼦。在Android开发中,我们经常使⽤SharedPreference来存储数据,如果忘记调⽤apply或者commit则数据修改不能应⽤。利⽤Kotlin中的⾼阶函数的功能,我们能更好的解决这个问题
fun SharedPreferences.editor(f: (SharedPreferences.Editor) -> Unit) {
val editor = edit()
f(editor)
editor.apply()
}
//实际调⽤
it.putBoolean("installed", true)
}
当然这上⾯的例⼦中我们也同时使⽤了⽅法扩展这个特性。
Kotlin⽀持了Streams API和⽅法引⽤,这样函数式编程更加⽅便。⽐如下⾯的代码就是我们结合Jsoup,来抓取某个proxy⽹站的数据,代码更加简单,实现起来也快速。
fun parse(url: String): Unit {
Jsoup.parse(URL(url), PARSE_URL_TIMEOUT).getElementsByClass("table table-sm")
.first().children()
.filter { "tbody".equals(it.tagName().toLowerCase()) }
.flatMap(Element::children).forEach {
trElement ->
ProxyItem().apply {
trElement.children().forEachIndexed { index, element ->
when (index) {
0 -> {
host = ().split(":")[0]
port = ().split(":")[1].toInt()
}
1 -> protocol = ()
5 -> country = ()
}
}
}.let(::println)
}
kotlin 高阶函数}
字符串模板
⽆论是Java还是Android开发,我们都会⽤到字符串拼接,⽐如进⾏⽇志输出等等。在Kotlin中,字符串模板是⽀持的,我们可以很轻松的完成⼀个字符串数组的组成
val book = Book("Thinking In Java", 59.0f, "Unknown")
val extraValue = "extra"
Log.d("MainActivity", "book.name = ${book.name}; book.price=${book.price};extraValue=$extraValue")
注意:关于字符串拼接可以参考这篇⽂章Java细节:字符串的拼接
与Java交互性好
Kotlin和Java都属于基于JVM的编程语⾔。Kotlin和Java的交互性很好,可以说是⽆缝连接。这表现在
1. Kotlin可以⾃由的引⽤Java的代码,反之亦然。
2. Kotlin可以现有的全部的Java框架和库
3. Java⽂件可以很轻松的借助IntelliJ的插件转成kotlin
Kotlin应⽤⼴泛
Kotlin对Android应⽤开发⽀持⼴泛,诸多⼯具,⽐如kotterknife(ButterKnife Kotlin版),RxKotlin,Anko等等,当然还有已经存在的很多Java的库都是可以使⽤的。
除此之外,Kotlin也可以编译成JavaScript。最近使⽤Kotlin写了⼀段抓取proxy的代码,实现起来⾮常快捷。甚⾄⽐纯JavaScript实现起来要快很多。
fun handle(): Unit {
.children.asList().filter { "TBODY".equals(UpperCase()) }
.flatMap { it.children.asList() }.forEach {
var proxyItem = ProxyItem()
it.children.asList().forEachIndexed { index, element ->
when (index) {
0 -> {
proxyItem.host = imedTextContent()?.split(":")?.get(0) ?: ""
proxyItem.port = imedTextContent()?.split(":")?.get(1)?.trim()?.toInt() ?: -1
}
1 -> proxyItem.protocol = imedTextContent() ?: ""
5 -> untry = imedTextContent() ?: ""
}
}.run {
console.info("proxyItem $proxyItem")
}
}
}
}
关于性能
Kotlin的执⾏效率和Java代码的执⾏效率理论上⼀致的。有时候Kotlin可能会显得⾼⼀些,⽐如Kotlin提供了⽅法的inline设置,可以设置某些⾼频⽅法进⾏inline操作,减少了运⾏时的进栈出栈和保存状态的开销。
读到这⾥,是不是想要尝试⼀下Kotlin呢,它简洁的语法,汇集诸多特性,⾼效率实现等等,已经在国外风⽣⽔起,国外的Pintereset, Square, Flipboard等公司已经开始应⽤到⽣产中。
关于转向Kotlin
其实,我在做决定之前(当时Kotlin还没有被钦定)也曾有过考虑,是不是选择了Kotlin就意味着放弃Java呢,冷静下来想⼀想,其实并不是那么回事,因为Kotlin与Java语法太相近,以及在Kotlin中⽆时⽆刻不在和Java相关的东西打交道,所以这点顾虑不是问题的。
对于个⼈的项⽬来转向Kotlin,通常不是很难的选择,毕竟Kotlin是那么优秀的语⾔,相信很多⼈还是愿意尝试并使⽤这个事半功倍的语⾔的。
⽽⽐较难抉择的情况是如果如何让团队转⽤Kotlin,个⼈认为团队难以转⽤的原因有很多,⽐如学习成本,历史包袱等等。但其实根本原因还是思维⽅式的问题,歪果仁喜欢⽤⼯具来提升开发效率,因为
⼈⼒成本很⾼。⽽国内团队提⾼效率的办法通常是增加成员。好在Flipboard 美国团队⾃2015年(可能更早)就引⼊了Kotlin,因此中国团队这边选⽤Kotlin也更加顺⽔推⾈。当然更主要的是⽬前团队规模不⼤,成员⼀致认可Kotlin的优点。
关于团队转⽤Kotlin的⽅法,⼀般⽐较⾏得通的办法是⾃上⽽下的推⾏。这就意味着要么直接的技术负责⼈⽐较开明要么就是需要有⼈来不断推介来影响团队。
做个⽐较现实的⽐拟,Java就像是⼀趟从我的家乡保定开往北京西的耗时将近2个⼩时甚⾄更长的普通列车,⽽Kotlin则是那趟仅需40分钟就能到达的⾼铁。通常的⼈都会选择⾼铁,因为它节省了时间和提⾼了体验。这个时间和体验对应编程中的,我想应该是⾼效率和⾼可读性,可维护性的代码。
现在好了,有了Google的⽀持,Kotlin转Android相信在不久的将来就会全⾯展开。篡改Python的⼀句名⾔“⼈⽣苦短,我⽤Kotlin”,这样⼀个⾼效实⽤的语⾔应该会被越来越多的团队所接受,并应⽤到开发⽣产中。当然也希望在国内环境下⼤放异彩。
感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论