Android宣布支持Kotlin

这次Google I/O大会宣布android支持Kotlin作为开发语言,Kotlin是一种设计精妙的语言,相信回事Android开发更快更有趣,已经被一些主要的开发商作为应用程序开发所使用,Kotlin也和Java能够很好的同时使用,两种语言之间可以轻松的相互操作。

Kotlin插件已经与Android Studio 3.0绑定了,所以你现在可以下载Android Studio 3.0的预览版使用,Kotlin是被JetBrains公司开发的,而Intellij也是由该公司开发的,所以对于Kotlin的支持并不奇怪。

除了IDEA支持之外,Google还宣布与JetBrains进行合作,将Kotlin作为一种非盈利的基础来推动。

say "Hello" to Kotlin

Kotlin与java很类似

package helloworld

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

乍一看,你会看到大括号,类,包,方法,但是随着学习的深入。例如,也许你会问为什么要实现一些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历史

Kotlin的出现已经有一段时间了,在2011年就已经被宣布了,并且第一次预览版在2012年发布,Kotlin 1.0版本在2016年发布,而JetBrains也一直致力于维护Kotlin的稳定性以及兼容性。
你可以在https://kotlinlang.org找到优秀的学习资料和参考资料,Android团队发现Kotlin Koans教程作为开始编写Kotlin片段的一种快速学习方式是非常有用的,这些教程的范围从简单到复杂。

为什么是Kotlin

为什么Android团队决定支持Kotlin,最重要的是,这是因为android团队认为Kotlin是一种伟大的语言,将使Android应用程序开发起来更轻松,更愉快。

Kotlin也是现有Android生态系统的绝佳搭档,他与Java语言100%兼容,你可以根据需要将Kotlin添加到现有的代码库中,并且在同一个项目中自由使用两种语言。

最终,很多开发者都说他们很喜爱Kotlin变成语言,Android官方团队的很多开发者也这样说,已经有一个热衷于Android的Kotlin开发社区,Android团队经常在公开活动中对Kotlin提出疑问,而且已经得到了反馈。

快速预览

为了帮助你们了解Kotlin,这里有一个快速的但是不完整的Kotlin之旅。

Nullable

Kotlin编译器强制可以显示的声明可以为空值的变量。因此在运行过程中不会出现空指针异常。

var neverNull: String="something"
var mightBeNull:String?=null //?表明可以为null
if(neverNull.length>0){ 
}
if(mightBeNull.length>0){ //编译器会捕获这个错误
}

命名参数和默认的参数

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表达式

when{
  password.equals("password") -> println("Insecure password")
  password.length < 4 -> println("Too short")
  else -> {
    println("Secure password")
  }
}

智能转换

如果你需要将一个对象转换成另外一个对象的时候,需要使用instance of来进行测试,但是Kotlin就不需要这么做了

if(obj is String){
  //编译器将obj转换成String
  if(obj.length>0){
    ...
  }
}

Kotlin中

when (obj){
  is Cat -> obj.meow(...)
  is Dog -> obj.woof(...)
  else -> {
  }
}

扩展方法

Kotlin将新方法定位到现有的类型上,如果你希望String类有一个toPigLain方法,你可以自己添加,而无需创建一个新的帮助类。

//"String."表明这些方法应该继承现有的String类
fun String.toPigLatin():String{
  ...
}
val plainOldString:String = "some text"

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对象,提取其三个属性,然后分配给三个变量,这些变量都是由Kotlin编译器提供的,这里为你推荐了正确的类型。

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

lambdas表达式

Kotlin对于Lambda有非常简洁的语法,可以很容易表达强大的变成范例,这是一个简单的例子,它使用lambda来测试集合中的所有内容都是String:

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

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入门,你可以直接使用这个代码,在你的app中尝试使用Kotlin,通过如下步骤:

  • 下载Android Studio 3.0
  • 打开已经存在的java文件
  • 调用Code > convert java file to kotlin file
    IDE将会添加Kotlin依赖到你的项目中,然后转换java代码到koelin代码。

参考文章

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

Kotlin入门:https://developer.android.com/kotlin/get-started.html

Kotlin学习资料:https://developer.android.com/kotlin/resources.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容