0

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

neo created at6 years ago view count: 2877

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

report
回复
0

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

6 years ago 回复
0
jk #

Java 不思进取啊

6 years ago 回复
0
jk #

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

6 years ago 回复