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,要遵循以下步骤:

  1. 下载Android Studio 3.0
  2. 随便打开一个已存在的".java"文件。
  3. 点击"Code > Convert Java File to Kotlin File"

然后IDE将Kotlin依赖项添加到项目中,然后将代码转换为功能一样的Kotlin代码。(IDE也会提供转换类的所有调用站点,以适应更为惯用的Kotlin,像静态方法被移动到伴生对象)。 您还可以找到更多有关如何开始使用Kotlin的信息在developer.android.com上。

results matching ""

    No results matching ""