0

Android 官方宣布支持 Kotlin 编程语言

neo 发布于2年前 阅读数 2418

今天 Android 团队宣布正式添加对 Kotlin 语言的支持。Kotlin 是一个出色,成熟的语言,我们相信它会让Adnroid 开发变得更有趣更快。 现在已经被 Expedia, Flipboard, Pinterest, Square 用于在生产环境。Kotlin 能和 Java 友好的相互调用。

Kotlin 的插件已经默认被打包到了 Android Studio 3.0 版本中, 现在已经可以下载。Kotlin是由JetBrains开发的,所以不用担心 Kotlin 在 IDE 支持上面的问题。我们还宣布与JetBrains进行合作,将Kotlin 交由非盈利基金。 (Kotlin已经在Apache2下开源了)。

Hello world

Kotlin 和 Java 很相似。

package helloWorld

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

看一眼就能清晰的分辨出 括号 class package 和 fucntion , 深入学习后你就会发现, 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 已经开发很久了。 2012年第一个预览版本发布,到2016 1.0版本发布。在这以后 JetBrains 会一直保持以前版本的功能稳定和向后的兼容性。https://kotlinlang.org/ 上面有很多教程和参考资料。Android 团队发现 Kotlin Koans教程对于快速入门写Kotlin很有用。这些教程深入浅出,循序渐进。

为什么选择Kotlin

为什么 Android 团队决定支持Kotlin。这是因为我们认为Kotlin是一种好的语言。Kotlin 能使开发Android 应用更加轻松。它与Java 100% 兼容。你能根据需要添加Kotlin代码到你现有的项目中。可以同时自由的使用两个语言在同一个项目。 有很多开发者告诉我们他们喜欢用Kotlin(Adnroid 团队内部也有相同的声音), 这里有很多活跃的使用Kotlin开发Android的开发人员社区。

Adnroid 团队在各种活动中也经常遇到Kotlin相关的提问。Adnroid社区的呼声,我们已经听到。

快速浏览Kotlin特性

下面是一些Kotlin 让人兴奋的特性。

Nullable

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 语句

Switch 的变体, 能匹配任意表达式。

// 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!")
    }
}

智能的类型转换 ( Smart Casts)

当你想要转换类型时候,想要判断是否是某个类的实例。在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 -> {
        …
   }
}

Extension functions

Kotlin 能让你快速把功能映射到当前类。不需要去创建一个新的类。

// 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())

解构声明 (Destructuring Declarations)

快速定义一个类

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

返回值中返回一个类。 类似于多个返回值支持。

fun getOrder(...): Order {
    ...
    return Order(itemCode, quantity, price);
}

你可以使用解构声明语法。 以下语句使用Order对象,提取其三个属性,然后将它们分配给三个变量,这些变量都是由Kotlin编译器提供的, 同时赋予正确的类型.

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

Lambdas

Kotlin对lambdas也非常简洁,很容易地表达强大的功能编程范例。 下面是一个简单的例子,它使用lambda来测试集合中的所有内容是否都是String:

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

lambdas 语法是Kotlin 最酷的地方。 它能书写JSON一样的代码块。就像下面的代码片段一样 这份代码来自 https://kotlinlang.org/docs/reference/type-safe-builders.html 你可以在这里发现完整的代码和说明。

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)
}

在这个例子中,“html”,“head”,“body”等都只是用Kotlin编写的函数,而后面是大括号的东西是功能参数(这个片段使用具有与HTML标签匹配的名称的函数来构建网页,当然也可以使用此模式构建任何复杂数据结构。)第二个有趣的是“withEmphasis”条件。 这让你在建立复杂的数据结构使用声明式语法,同时还能使用Kotlin语言的全部功能。

快速开始

在线编辑器:https://try.kotlinlang.org/

使用 Kotlin 开发 APP

IDE会自动添加项目中的依赖。然后把代码转换为Kotlin代码。

更多信息查看:https://developer.android.com/kotlin/get-started.html

原文地址:https://android-developers.googleblog.com/2017/05/android-announces-support-for-kotlin.html

举报
回复
0

Android 团队应该是 JetBrains 团队经常合作,所以才有了这出

1年前 回复
0
jk #

Java 不思进取啊

1年前 回复
0
jk #

setter 这些都是自动生成, 但是真的没有必要,搞一大堆代码。

1年前 回复