Android宣布支持Kotlin
原标题:Android Announces Support for Kotlin
链接:https://android-developers.googleblog.com/2017/05/android-announces-support-for-kotlin.html
作者: Mike Cleron,Android平台总监
翻译: arjinmc
目前Android团队很高兴地宣布,我们正式加入了支持Kotlin 编程语言。Kotlin是一种精湛的设计,成熟的语言,我们相信会使Android开发更快更有趣。它已经被几个主要开发商 - Expedia,Flipboard,Pinterest,Square等其他团队采用 - 用于其生产应用程序。Kotlin也使用Java编程语言表现出色; 两种语言之间的毫不费力的互操作是Kotlin的优势。 Kotlin插件现在与Android Studio 3.0捆绑在一起,可立即下载。Kotlin是由JetBrains开发的,跟创造IntelliJ是同一个团队,所以并不感到意外,IDE对Kotlin的支持是非常出色的。 除了IDE支持之外,我们还宣布与JetBrains进行合作,将Kotlin推向非盈利基金会。(Kotlin已经在Apache2下开源了。)
向Kotlin说“你好”
任何使用Java编程语言的人都会对Kotlin有熟悉的感觉。
package helloWorld
fun main(args: Array) {
println("Hello World!")
}
第一眼看,你会看到像大括号,类,包,功能和方法这样的让人感到舒服的关键字。但是随着你的深入,你会发现,虽然Kotlin是基于熟悉的概念,它基于这些模型是一个独特的现代,优雅和务实的语言。特别是,Kotlin具有极高的表现力在于缩小你的想法和你写的代码之间的磨合,更好的表达这些想法。如果在编写代码的时候,你问自己的问题,那就是为什么我必须...?你会很高兴地学习到Kotlin对于许多这些问题的答案是“你不要!”
例如,也许你会问为什么实现一个简单的类时你需要输入一堆样板的getter和setter以及重写equals(), hashCode()并且toString()。以下是Java编程语言的典型示例(为了简洁起见,用微小的字体)。
public class Customer {
private String name;
private String email;
private String company;
public Customer(String name) {
this(name, "", "");
}
public Customer(String name, String email) {
this(name, email, "");
}
public Customer(String name, String email, String company) {
this.name = name;
this.email = email;
this.company = company;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Customer customer = (Customer) o;
if (name != null ? !name.equals(customer.name) : customer.name != null) return false;
if (email != null ? !email.equals(customer.email) : customer.email != null) return false;
return company != null ? company.equals(customer.company) : customer.company == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (email != null ? email.hashCode() : 0);
result = 31 * result + (company != null ? company.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
", company='" + company + '\'' +
'}';
}
}
在Kotlin,你不必输入任何一个类型。这一行相当于上面的整个类。
data class Customer(var name: String, var email: String = "",
var company: String = "")
历史与参考
Kotlin已经有一段时间了,它在2011年被公布,第一次预览于2012年发布.Kotlin 1.0于2016年发布,JetBrains在这一点上致力于保持1.0向前的稳定功能的向后兼容性。 您可以在https://kotlinlang.org/找到优秀的培训资料和参考资料。Android团队发现Kotlin Koans教程用开始编写Kotlin片段的方式来指导是特别快速和有用的。这些教程的范围从简单到高级,因为材料从基础到更复杂的Kotlin风格。
为什么选择Kotlin?
为什么Android团队决定支持Kotlin?最重要的是,这是因为我们认为Kotlin是一种伟大的语言,将使Android应用程序更简单,更愉快。
Kotlin也是现有Android生态系统的绝佳搭档。它与Java编程语言100%兼容。您可以根据需要将Kotlin添加到现有的代码库中,并在同一个项目中自由混合两种语言。通过用Java别写的Just Works™组件调用Kotlin代码。然后它会自动转换语言,不需要开发者费劲去处理。(例如,像属性的getter 和setter方法等)。使用Kotlin的注释,你还可以自定义这些转换语言内容。
最后,许多很多开发人员告诉我们,他们喜欢Kotlin语言。(Android团队中许多我们自己的开发人员也一直在说类似的东西)。已经有一个Android的Kotlin开发人员的热心社区,Android团队在公开活动中常常对Kotlin提出疑问。在Android社区发言,我们在听。
快速浏览
为了帮助您了解Kotlin周边的东西,这里是快速对Kotlin的一些特别吸引人的方面,非常小片段的游览:
Nullable
Kotlin编译器会在变量为null时候会被强制声明 - 因此在运行时不再有空指针异常!
var neverNull: String = "something"
var mightBeNull: String? = null // "?" indicates this can be null
if (neverNull.length > 0) { // This is OK
…
}
if (mightBeNull.length > 0) { // Compiler catches this error for you
…
}
命名参数和默认参数
我们已经看到方法里面有太多参数要记录。例如:
fun orderPizza(size: Size, pepperoni: Boolean, mushrooms: Boolean,
ham: Boolean, pineapple: Boolean, pickles: Boolean,
sausage: Boolean, peppers: Boolean, onion: Boolean)
{
...
}
// Wait… did I just order pickles on my pizza?
// Why do we even have that option?
orderPizza(Size.LARGE, true, false, false, false, true,
false, true, false)
对比一个类似的方式,使用命名的参数和默认值
fun orderPizza(size: Size,
pepperoni: Boolean = false,
mushrooms: Boolean = false,
ham: Boolean = false,
pineapple: Boolean = false,
pickles: Boolean = false,
sausage: Boolean = false,
peppers: Boolean = false,
onion: Boolean = false)
{
...
}
orderPizza(Size.LARGE, ham = true, mushrooms = true)
除了帮助避免不幸的比萨结果之外,这更容易阅读。它还减少了您需要编写的重载方法的变量数量。
when语句
Kotlin具有允许匹配任意表达式的来做判断。
// 请勿放入你的app
when {
password.equals("password") -> println("Insecure password!")
password.length < 4 -> println("Too short!")
else -> {
println("Secure password!")
}
}
智能的类型转换
为什么你要在类型转换之前先用instance of Class 再进行类型转换?在Kotlin,你无需这样做了。
if (obj is String) {
// Compiler casts obj to a String for you.
// (Would work with && instead of nested ifs too.)
if (obj.length > 0) {
…
}
}
同样,用when来实现
// Assume reasonable implementations of Cat and Dog
when (obj) {
is Cat -> obj.meow(...)
is Dog -> obj.woof(...)
else -> {
…
}
}
扩展功能
Kotlin允许你把现有的方法扩展出新的方法。如果你像许多人一样希望String类有一个toPigLatin方法,你可以自己添加它,而不需要创建一个新的辅助类来包装String否则会在这语言构建中饱受麻烦:
// The "String." prefix indicates that this method should
// extend the existing String class
fun String.toPigLatin() : String {
...
}
val plainOldString : String = "some text"
// Can now call toPigLatin as if were a method on String
println(plainOldString.toPigLatin())
// Or:
println("some text".toPigLatin())
解构声明
我们已经看到定义简单数据类是多么简单:
data class Order(val itemCode: String, val quantity: Int,
val price: Float)
使用这些类之一作为返回类型的函数非常接近于支持多个返回值:
fun getOrder(...): Order {
...
return Order(itemCode, quantity, price);
}
要得到所有的方法,您可以使用解构声明语法。以下语句接收Order对象,提取其三个属性,然后将它们分配给三个变量what, howMany并且howMuch- 所有由Kotlin编译器提供的,这也为你判断出正确的类型。
val (what, howMany, howMuch) = getOrder(...)
Lambdas
Kotin对于lambdas有一个非常简洁的语法,可以很容易地表达强大的功能编程范例。这是一个简单的例子,它使用lambda来测试集合中的所有内容都是String:
fun allStrings(collection: Collection)=
collection.all { it is String }
该lambda语法是Kotlin最酷的功能之一的构建块:创建使用类似JSON的语法的构建器的能力,这也恰好是语法上有效的Kotlin。这个例子是从这里的一个扩展的讨论中改编而来的 ,但是你可以通过这个代码片段获得可能的东西:
fun generatePage(withEmphasis : Boolean) {
val result =
html {
head {
title { +"Kotlin Builders" }
}
body {
h1 { +"Kotlin Builders" }
p {
+"This is "
if (withEmphasis) b { +"really " }
+"interesting"
a(href = "https://goo.gl/rHwJio") { +"More here" }
}
}
}
println(result)
}
这里有几件有趣的事情。首先,这显示了Kotlin语法如何表达:在这个例子中,“ html”,“ head”,“ body等等都只是用Kotlin编写的函数,而后面是大括号的东西是参数(这个代码段使用HTML标签作为方法名字以构建网页,但当然,你可以使用此模式构建任何你想要的名称的复杂数据结构。)第二个有趣的是“ withEmphasis”条件的,这可能看起来像我们正在混合代码(if (withEmphasis)...)与数据(所有HTML标签),但是这里的“数据”实际上是更多的代码。因为它是真是的代码,者可以让你使用声明语法创建复杂的数据结构,对Kotlin语言进行内联访问。
入门
如果你学习Kotlin,你可以玩一下这个马上能运行在线版工具。点击绿色三角形久可以编译运行。
在app中使用Kotlin,要遵循以下步骤:
- 下载Android Studio 3.0
- 随便打开一个已存在的".java"文件。
- 点击"Code > Convert Java File to Kotlin File"
然后IDE将Kotlin依赖项添加到项目中,然后将代码转换为功能一样的Kotlin代码。(IDE也会提供转换类的所有调用站点,以适应更为惯用的Kotlin,像静态方法被移动到伴生对象)。 您还可以找到更多有关如何开始使用Kotlin的信息在developer.android.com上。