Dive Into Kotlin(一):初探 Kotlin

本文由 Prefert 发表在 ScalaCool 团队博客。android

在今年的 Google I/O 大会上,Google 宣布在 Android 上为 Kotlin 提供一等支持(转为正房)。git

在 Andorid 开发的圈子中,这无疑掀起了轩然大浪。对部分人来讲,也许这是第一次听到 Kotlin 。事实上,在 2011 年 7 月,JetBrains 就推出 Kotlin 项目,直到去年 2 月 Kotlin v1.0 才正式发布。程序员

本系列文章「Dive Into Kotlin」将会对 Kotlin 进行较为系统的介绍,大体分为四个章节:github

1. 热身 —— Kotlin 基本特性
2. 下水 —— Kotlin 与函数式
3. 潜入 —— Kotlin 核心
4. 遨游 —— kotlin 与 Android 实战编程

本文将简单介绍 Kotlin 的生态和部分语言功能,目录以下:安全

  • Kotlin 是一门怎么样的语言
  • 强大的生态圈
  • 基本特征

Kotlin 是一门怎么样的语言?

Kotlin 是一种在 JVM 上运行的静态类型编程语言,能够编译成 Java 字节码,也能够编译成 JavaScript,方便在没有 JVM 的设备上运行。框架

Kotlin 核心的目标

  • 简约:帮你减小实现同一个功能的代码量。编程语言

  • 易懂:让你的代码更容易阅读,同时易于理解。ide

  • 安全:移除了你可能会犯错误的功能。函数式编程

  • 通用:基于 JVM 和 JavaScript,你能够在不少地方运行。

  • 互操做性: Kotlin 和 Java 能够相互调用,同时 Jetbrains 的目标是让他们 100% 兼容。
    对比 Java,Kotlin 或许显得有点年轻,但这并不表明它的生态圈不够稳定。

强大的生态圈

Kotlin 编译为 JVM 字节码或 JavaScript
它能够吸引全部使用垃圾回收机制语言的程序员,包括 Java,Scala,Go,Python, Ruby 和 JavaScript。

kotlin 产自工业,而不是学术界。
它解决了程序员目前所面临的一些问题。举个例子:类型系统能够帮助你避免空指针异常。当咱们在使用一些 API 或者大型库时判断是否为 null,每每没有什么实际做用。

Kotlin 完美兼容 Java
在 Idea 中,你能够一键实现 Java 与 Kotlin 的转换。也就是说, Kotlin 写的项目中可使用全部现有的 Java 框架和库,甚至是依赖于注解的高级框架,而且它整合了 Maven,Gradle 和其余构建工具——帮助咱们实现无缝的互操做。

Kotlin 相对入门简单
因此正如你们所说的那样,Kotlin 是一门十分友好的语言,你甚至能够花几个小时阅读下相关书籍就能入门。它的语法简洁直观,也许大多时候看起来比较像 Scala,实际上简单了不少。这种语言很好地平衡了简洁和可读性。

不施加运行时间的开销
标准库是比较小的:主要是对 Java 标准库的重点扩展。大量使用编译时内联(compile-time inlining)就意味着像 mapfilterreduce 这样的语法编译起来与命令式的类似。

Android扩展库
Ankokovenant 让 Kotlin 在 Android 的开发中更加方便,若是你看过这两个库,必定也为之青睐。

除 Android 外,其实企业级别的 Java 项目也能够考虑使用 Kotlin:

  1. 它有一个成熟的公司强大的商业支持,JetBrains 致力于该项目的发展,拥有一支高效的团队和稳定的商业模式。在较长的时间内,你都不用担忧 Kotlin 被抛弃。

  2. Kotlin 的风险很低:能够由一两个成员尝试在某个功能块使用,但并不会影响其余模块:Kotlin 类能够导出一个与常规 Java 代码看起来相同的 Java API。

  3. Java 6 废土中的一线但愿:若是升级 JVM 对于大家的成本很高,你可使用 Kotlin,它是「增强版的 Java 6」。

看完生态圈,来看看最吸引咱们的语言功能部分。

特征

kotlin&&Android

属性前置

Java Bean 中老是出现一些重复工做量的代码:

public class Customer{
  String name;
  int age;

  public Customer(String name, int age){
    this.name=name;
    this.age=age;
  }
  
  public String getName(){
    return name;
  }
  
  public int getAge(){
    return age;
  }
  
  public setName(String name){
    this.name=name;
  }
  public setAge(int age){
   this.age=age;
  }
}
复制代码

在 Java 对象中,构造函数和属性的 GetterSetter 函数在每一个Bean类中都会出现,看起来很是冗余。

可是使用 Kotlin,代码是这样的:

data class Customer(val name:String, val age:Int)
复制代码

Kotlin 将GetterSetter 等函数省略,让咱们更加关注属性。

函数式编程是变革的关键

若是你是一名 「FP」 (Functional Programming) 爱好者,你确定知道 Scala 这门语言。而 Kotlin 的设计初衷就是提供 Scala 里的不少特性,但不被编译时间束缚。

FP

网上对函数式编程的介绍,大多数对初学者都是不够友好的,下面是一种比较简洁的归纳:

函数编程以基于数学的函数构成,实现一个功能时倾向于实现的目标,而不是实现目标的方式。

也就是说,函数式编程处理的是不可变的数据,即不会改变变量的值。它所作的只是 Receive(接收)-> Compute(计算)-> Return(返回) ,而不改变它接收到的值,或者引发「反作用」

Kotlin 从新定义了函数的写法

  • 简化函数重载。
  • 命名参数不遵循顺序:命名参数容许彻底控制什么值被传递给变量,并在与布尔处理,举个例子:
// Java
void check(boolean isAlpha, boolean isNum){
	// do something
}
check(true, false); // 函数调用

// Kotlin
fun check(isAlpha:Boolean, isNum:Boolean = false) {
   // do something
}
check(true)// 1
check(true,true)// 2
check(isAlpha = true, isNum = false) // 3
check(isNum = false, isAlpha = true) // 4
复制代码

其中一、三、4实际效果一致。

函数可读性

  • 单行表达式是提升代码可读性的第一步。
// Java
int sum (int x, int y){ // 必须声明返回类型
  x = x + y; // x的值被改变,带来反作用
  return x;
}

// kotlin
fun sum(x: Int, y: Int) = x + y // 完美
复制代码

在 Android 开发时,咱们应该都会对视图的 onClick 事件感到烦躁。

// Java
view.setOnClickListener(new View.OnClickKistener() {
  @ Override public void onClick(View v){
    System.out.println("sad");
  }
});
复制代码

在 kotlin 中,这也获得简化:

view.onClick {
  println("nice !!")
}
复制代码

类型安全

在 Android 开发中,出现 NullPointerException 已经能够说是屡见不鲜了。但若是在运行的时候出现这个异常致使程序崩溃,对用户体验形成的损失是巨大的。

Kotlin 能很好的避免这个问题:

  • 指定 null
// Java
String text1 = null // NE 

// Kotlin
var text1: String = "Kotlin"// 正常
var text2: String = null // NE
var text3: String ?= null // 正常
复制代码

Kotlin 中只有加了 ? 才容许为 null。

  • 检查 null Kotlin 能够经过 ?确保安全调用:
// Java
if(a != null){
  int x = a.length();
}
// Kotlin
val x = a?.length // 仅当 a 不为 null 时才能经过编译
复制代码
  • 为 null 时默认值
val x = b?.length ?: 0 // 若是 b 为 null,那他的 length 就为0
val x = b?.length ?: throw NullPointerException()
val x = b!!.length    
复制代码

Lambda 优化

Lambda 表达式增长了 Kotlin 的简洁功能,从而也让代码更容易理解。(Java 6 不支持 lambda )

val sum = {x: Int, y: Int -> x + y} // 类型:(Int, Int) -> Int
val result = sum(2, 7// result == 9
复制代码

条件判断更优雅

kotlin 中 when 一样能带给你惊喜,你能够用它简化 if..elseswitch

// Java
if(x == 1) println("x is 1");
else if(x == 2) println("x is 2");
else if(x == 3 || x == 4) println("x is 3 or 4");
else if(x >= 5 || x <= 10) println("x is 5, 6, 7, 8, 9, or 10");
else println("x is out of range");

// Kotlin
when (x) {
  1 -> print("x is 1")
  2 -> print("x is 2")
  3, 4 -> print("x is 3 or 4")
  in 5..10 -> print("x is 5, 6, 7, 8, 9, or 10")
  else -> print("x is out of range")
}
复制代码

固然除了以上这些,Kotlin 还有许多使人惊喜的特性,将会在后续的文章中详细介绍,敬请期待。

相关文章
相关标签/搜索