为什么必须试试用 Kotlin 做 Android 开发?
2016-11-29 本文已影响1006人
6db2cd5e23ce
原文地址:Why You Must Try Kotlin For Android Development ?
转载请带上原文以及本文链接
Kotlin 是一种可以运行在 JVM 、 Android 和浏览器上的静态型别编程语言 (statically typed programming language)。
为什么要用 Kotlin 做 Android 开发?
- 简洁:大量减少重复代码。
- 安全:避免报错,例如:空指针异常。
- 多用途(Versatile):无论是构建后端应用、Android应用还是运行在浏览器上的前端程序都不在话下。
- 可互用(Interoperable):可以100%与 Java 协同工作(100% interoperable with Java™)
来看看细节(Kotlin vs Java)
- 与 Java 互用 (Interoperable with Java):当你想尝试一种新的语言时,“可互用”能帮上大忙。“可互用”意味着你可以在 Kotlin 里面复用所有 Java 的类,反之亦然。而且 Java 开发者重新学习 Kotlin 比较容易上手。你在 Java 上能做的所有事情,Kotlin 也都能胜任。如果你不清楚一段 Kotlin 代码如何书写,那就先把 Java 代码写一遍然后 Kotlin 插件会自动转换,这样你就可以看到两者有哪些不同,下一次自己再敲一遍也就学会了。
- 空指针安全 (Null Safety):Kotlin 致力于防止代码中出现空引用错误,避免类似《价值亿万美金的错误》(The Billion Dollar Mistake) 这样的事情发生 。
许多编程语言(包括 Java)都有访问空对象导致空指针异常的隐患,在 Java 里面一般叫做:NullPointerException
,或者缩写为:NPE
。
在 Kotlin 里面,会区分哪些可以为空 (nullable references),哪些不可以为空 (non-null references),例如一个String
变量不能为空:
var a: String = “abc”
a = null //编译报错
如果想允许空引用,你可以用String?:
声明一个可以为空的字符串:
var b: String? = “abc”
b = null //通过
现在,如果你想通过变量a
调用一个方法或者成员属性,那么就没必要再担心发生空指针异常了,所以可以大胆的这样写:
val l = a.length
如果把变量a
换成变量b
,那这个操作就是不安全的,编译器会报一个错误:
val l = b.length // error: variable ‘b’ can be null
但是如果非要用b
来做操作呢?这里也有几个办法。
空判断:
首先,可以直接做“空判断”,然后对“空”和“非空”分开处理:
val l = if (b != null) b.length else -1
安全调用:
上面那种方式太过普通了,这里还有第二种办法,通过安全调用的操作符 (safe call operator) “?.
”来实现:
b?.length
这样,如果b
不为空则返回length
的值,否则返回null
。
- 智能类型转换(Smart Casting) :**
// Java
if (node instanceOf Leaf) {
return ((Leaf) node).symbol;
}
// kotlin
if (node is Leaf) {
return node.symbol; //智能转换, 不需要强转
}
if (document is Payable && document.pay()) { //智能转换
println(“Payable document ${document.title} was payed for.”)
}
Kotlin 使用跟 Java 一样的“惰性计算 (lazy evaluation)”,也就是说如果document
不是Payable
类型的,那么&&
后面的语句也就不会执行了,所以当执行到document.pay()
的时候,Kotlin 很智能的把document
转换成Payable
来操作。
- 参数命名(Named Arguments):从代码可读性的角度来说,给参数命名让 Kotlin 变得非常好用(awesome)。
val amit = Developer(“Amit Shekhar”, age = 22, someValue = 10, profile = “Android Developer”)
//下面这句代码根本看不懂写的是啥……
myString.transform(true, false, false, true, false)
//通过写明参数的名字后,下面的代码变得一目了然
myString.transform(
toLowerCase = true,
toUpperCase = false,
toCamelCase = false,
ellipse = true,
normalizeSpacing = false
)
-
函数式编程 (Functional Programming):当 Java 从 8.0 版本才引入“函数式编程”这个概念的时候,Kotlin 早已经开始使用了,其中包含了“高阶函数 (higher-order functions)”、“lambda 表达式”、“操作符重载 ( operator overloading)”、“惰性计算 (lazy evaluation)”,还有针对“集合”提供的很多有用的方法。
lambda 表达式和 Kotlin 库的结合真正让写代码变得更容易了。
val numbers = arrayListOf(-42, 17, 13, -9, 12)
val nonNegative = numbers.filter { it >= 0 }
println(nonNegative)
listOf(1, 2, 3, 4) //用 1,2,3,4 建立一个集合
.map { it * 10 } // 将集合里的每个数分别 x 10,返回新的值
.filter { it > 20 } // 筛选出 > 20的值,集合还剩 30,40
.forEach { print(it) } // 最终打印 30 40
-
简洁代码(Concise Code):**当用 Kotlin 替换 Java 代码时,可以让你项目的代码量大幅减少。
例如:
// Java
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/* your code */
}
});
// Kotlin
val button = findViewById(R.id.fab) as Button
button.setOnClickListener { view -> /* your code */}
谢谢阅读,转载请带上原文和本文链接。