1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//variables and constants var currentVersionCode = 1 //变量当前的版本号,类型Int能够根据值推断出来 var currentVersionName : String = "1.0" //显式标明类型 val APPNAME = "droidyue.com" //常量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() } |
var
表示变量,val
表示常量更加的简洁空指针(NullPointerException或NPE)是咱们使用Java开发程序中最多见的崩溃了。由于在Java中咱们不得不写不少防护性的代码,好比这样html
1
2 3 4 5 6 7 8 |
public void test(String string) { if (string != null) { char[] chars = string.toCharArray(); if (chars.length > 10) { System.out.println(((Character)chars[10]).hashCode()); } } } |
在Kotlin中空指针异常获得了很好的解决。java
以下面的代码就是Kotlin实现空指针安全的一个例子,并且相对Java实现而言,简直是一行代码搞定的。android
1
2 3 4 5 6 7 8 9 10 11 12 |
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中咱们能够这样作。数组
1
2 3 |
public static void longToast(Context context, String message) { Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } |
可是Kotlin的实现却让人惊奇,咱们只须要重写扩展方法就能够了,好比这个longToast方法扩展到全部的Context对象中,若是不去追根溯源,可能没法区分是Framework提供的仍是自行扩展的。安全
1
2 3 4 |
fun Context.longToast(message: String) { Toast.makeText(this, message, Toast.LENGTH_LONG).show() } applicationContext.longToast("hello world") |
注意:Kotlin的方法扩展并非真正修改了对应的类文件,而是在编译器和IDE方面作得处理。使咱们看起来像是扩展了方法。app
所谓的Lambda表达式是匿名函数,这使得咱们的代码会更加的简单。好比下面的代码就是lambda的应用。框架
1
2 3 |
findViewById(R.id.content).setOnClickListener { Log.d("MainActivity", "$it was clicked") } |
所谓的高阶函数就是编程语言
举一个接受函数做为参数的例子。在Android开发中,咱们常用SharedPreference来存储数据,若是忘记调用apply或者commit则数据修改不能应用。利用Kotlin中的高阶函数的功能,咱们能更好的解决这个问题函数式编程
1
2 3 4 5 6 7 8 9 10 |
fun SharedPreferences.editor(f: (SharedPreferences.Editor) -> Unit) { val editor = edit() f(editor) editor.apply() } //实际调用 PreferenceManager.getDefaultSharedPreferences(this).editor { it.putBoolean("installed", true) } |
固然这上面的例子中咱们也同时使用了方法扩展这个特性。
Kotlin支持了Streams API和方法引用,这样函数式编程更加方便。好比下面的代码就是咱们结合Jsoup,来抓取某个proxy网站的数据,代码更加简单,实现起来也快速。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 = element.text().split(":")[0] port = element.text().split(":")[1].toInt() } 1 -> protocol = element.text() 5 -> country = element.text() } } }.let(::println) } } |
不管是Java仍是Android开发,咱们都会用到字符串拼接,好比进行日志输出等等。在Kotlin中,字符串模板是支持的,咱们能够很轻松的完成一个字符串数组的组成
1
2 3 |
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细节:字符串的拼接
Kotlin和Java都属于基于JVM的编程语言。Kotlin和Java的交互性很好,能够说是无缝链接。这表如今
Kotlin对Android应用开发支持普遍,诸多工具,好比kotterknife(ButterKnife Kotlin版),RxKotlin,Anko等等,固然还有已经存在的不少Java的库都是可使用的。
除此以外,Kotlin也能够编译成Javascript。最近使用Kotlin写了一段抓取proxy的代码,实现起来很是快捷。甚至比纯JavaScript实现起来要快不少。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
fun handle(): Unit { window.onload = { document.getElementsByClassName("table table-sm").asList().first() .children.asList().filter { "TBODY".equals(it.tagName.toUpperCase()) } .flatMap { it.children.asList() }.forEach { var proxyItem = ProxyItem() it.children.asList().forEachIndexed { index, element -> when (index) { 0 -> { proxyItem.host = element.trimedTextContent()?.split(":")?.get(0) ?: "" proxyItem.port = element.trimedTextContent()?.split(":")?.get(1)?.trim()?.toInt() ?: -1 } 1 -> proxyItem.protocol = element.trimedTextContent() ?: "" 5 -> proxyItem.country = element.trimedTextContent() ?: "" } }.run { console.info("proxyItem $proxyItem") } } } } |
Kotlin的执行效率和Java代码的执行效率理论上一致的。有时候Kotlin可能会显得高一些,好比Kotlin提供了方法的inline设置,能够设置某些高频方法进行inline操做,减小了运行时的进栈出栈和保存状态的开销。
Kotlin的有不少特色,好比简洁,安全实用,开发效率高和提高可读性,更好的函数式编程支持。
1.简洁,Kotlin的代码确实比Java更加简洁,好比类型推断,省去结尾的分号等等,然而这远不能成为咱们改用Kotlin的缘由。
2.安全,这是Kotlin的一个很重要的特性。Kotlin是空指针安全的,JetBrains作了一件很聪明的事情,它们将运行时才能空指针的检测提早到了编译时,主要方式是增长了Any?这种可为空的类型,使用Kotlin以后,咱们程序的空指针会获得明显的改善。
3.实用,高效率。Kotlin的实用具体表如今
4.Kotlin引入了Lambda,Streams API 和函数式编程支持。
5.可读性 从客观上,Kotlin语法和特性上让代码更加具备描述性而已。可是不得不指出代码可读性主要依赖编写者的编码素质和能力。
对我我的而言,高阶函数和方法扩展这两个特色着实真心受用。方法扩展会让我有一种创造感,这是Java种的Util方法所没法比拟的。
有了Google的支持,Kotlin转Android相信在不久的未来就会全面展开。篡改Python的一句名言“人生苦短,我用Kotlin”,这样一个高效实用的语言应该会被愈来愈多的团队所接受,并应用到开发生产中。固然也但愿在国内环境下大放异彩。
refs:
http://droidyue.com/blog/2017/05/18/why-do-i-turn-to-kotlin/http://droidyue.com/blog/2017/05/21/my-opinion-of-kotlins-becoming-an-official-language-of-android/