Android 宣布支持Kotlin

原文来自: Android Announces Support for Kotlin

今天,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。

1
2
3
4
5
package helloWorld

fun main(args: Array) {
println("Hello World!")
}

乍一看,你会看到舒适的元素,如大括号,类,包,功能和方法。你会发现,虽然Kotlin是基于熟悉的概念,在这些模型上,它是独一无二的现代化,优雅和务实的。特别地是,Kotlin具有极高的表现力,最小的句法摩擦你的想法和你必须输入什么才能表达这些想法之间。如果在编写代码的时候,你问自己的问题,那就是为什么我必须…?你会很高兴地得知,在Kotlin,许多这些问题的答案是“你不要!”

例如,也许你已经问为什么要在实现一个简单的类时,要输入一堆getter和setter的样板,以及重写equals()、hashCode()和toString()。以下是Java编程语言的典型示例(为了简洁起见,用微小的字体)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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中,你没必要键入任何一个,这一行相当于上面的整个类。

1
2
data class Customer(var name: String, var email: String = "",
var company: String = "")

历史与参考

Kotlin已经有了一段时间了,它在2011年被公布,第一个预览于2012年发布。Kotlin 1.0于2016年发布,从1.0开始前进,JetBrains致力于保持向前兼容性稳定的功能。

你可以在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旅程:

可空

Kotlin编译器强制可以显式声明可以保存空值的变量 —— 因此在运行时不再有NullPointerExceptions!

1
2
3
4
5
6
7
8
9
10
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

}

命名参数和默认参数

我们都看到有太多参数的方法来跟踪。例如:

1
2
3
4
5
6
7
8
9
10
11
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)

将其与使用命名参数和默认参数的类似方案进行比较:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)

除了帮助避免不幸的比萨结果之外,这更容易阅读。它还减少了您需要编写的重载功能的变体数量。

当声明

Kotlin具有允许匹配任意表达式的switch语句的变体。

1
2
3
4
5
6
7
8
// Please don't put this in your app!
when {
password.equals("password") -> println("Insecure password!")
password.length < 4 -> println("Too short!")
else -> {
println("Secure password!")
}
}

智能铸造

在你刚刚测试它是该类的一个实例之后,为什么你必须在一个类上投下一些东西?在kotlin,你不必这样做了。

1
2
3
4
5
6
7
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语句:

1
2
3
4
5
6
7
8
// Assume reasonable implementations of Cat and Dog
when (obj) {
is Cat -> obj.meow(...)
is Dog -> obj.woof(...)
else -> {

}
}

扩展功能

Kotlin让您基本上将新方法重新定位到现有的类型上,如果像许多人一样,希望String类有一个toPigLatin方法。您现在可以自行添加它,而无需创建一个新的帮助器类来包装String或者在语言委员会中服务的麻烦:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 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())

解构定义

我们已经看到定义一个简单的数据类是多么容易:

1
2
data class Order(val itemCode: String, val quantity: Int,
val price: Float)

使用这些类之一作为返回类型的函数非常接近于支持多个返回值:

1
2
3
4
fun getOrder(...): Order {
...
return Order(itemCode, quantity, price);
}

要得到所有的方法,您可以使用解构声明语法。以下语句接受Order对象,提取其三个属性,然后将它们分配给三个变量:what, howMany 和 howMuch 。
—— 所有礼貌的Kotlin编译器,这也为您推荐正确的类型。

1
val (what, howMany, howMuch) = getOrder(...)

Lambdas

Kotin对于lambdas具有非常简洁的语法,可以很容易地表达强大的功能编程范例。这是一个简单的例子,它使用lambda来测试集合中的所有内容都是String:

1
2
fun allStrings(collection: Collection)=
collection.all { it is String }

创建使用类似JSON的语法的构建器的能力也恰好是语法上有效的Kotlin。这个例子在这里进行了扩展的讨论:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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-esque标签),但是这里的“数据”实际上只是更多的代码,因为它只是真正的代码,这可以让你建立 复杂的数据结构使用声明式语法,同时还具有对Kotlin语言的全部功能的内联访问。

开始获取

如果您想开始使用Kotlin,您可以立即在线开始使用代码。只需打绿色三角形即可编译并运行。

要在您的应用程序中尝试Kotlin,请按照下列步骤操作:

  • 1、下载Android Studio 3.0
  • 2、打开一个已存在的”.java”文件
  • 3、调用”Code > Convert Java File to Kotlin File”

然后,IDE将引导您将Kotlin依赖项添加到项目中,然后将代码转换为功能相当的Kotlin代码。(如果适用于更为惯用的Kotlin,IDE将会将所有的调用站点提供给转换的类,例如当静态方法被移动到配对对象时)。

您还可以在developer.android.com上找到更多有关如何开始使用Kotlin的信息。

以上内容根据原文使用Google Translate工具翻译而成

0%