Google在2017年的IO大会上宣布,将Android开发的官方语言更换为Kotlin。
1995年,当年如日中天的Sun公司发布了Java语言,引起了巨大的轰动,与当时主流的C语言和Basic语言比起来,Java语言简单、面向对象、稳定、与平台无关、解释型、多线程、动态等特点,就像是打开了一个新的世界,一时间风靡全球,云集者众,微软为了模仿Java搞出C#语言,Netscape为了赶时髦硬塞出一个JavaScript语言,IBM则捏着鼻子做了Java IDE Eclipse(日蚀,呵呵)。直到现在,Java在编程世界里还占据着举足轻重的地位,Andy Rubin在开发Android系统时,也很自然地采用了Java和C++(C++负责NDK开发)作为开发语言。
但是,Java毕竟是20多年前的语言了,虽然有不断扩展更新,但是底层设计思想是很难改动的,这就导致它很难实现一些新的语言特性,例如函数式编程、Lambda 表达式、流式API、高阶函数、空指针安全等(虽然Java8实现了部分特性,但是Android还不怎么支持Java8),这些新的语言特性大受好评,可以说解放了编程的生产力,这其实也说明了一个事实:开发效率/时间是软件公司真正的瓶颈,任何能压缩代码量,提高开发效率的举措,都应该受到重视。
而且,Android还存在Java版权危机的问题,收购了Sun公司的Oracle曾向Google索要巨额的Java版权费,这可能也加快了Google寻找Android开发替代语言的动作。
苹果公司已经在用Swift语言替代Object-C语言,Google也找到了替代Java的语言,也就是JetBrains公司(Android Studio也是用该公司的Intelli J改的)主推的Kotlin。
其实,Swift和Kotlin还挺相似的,有一篇Swift is like Kotlin对这两种语言做过简单的对比。
Kotlin也是基于JVM设计的编程语言,算是对Java的温和改良,她是一个开源项目的成果,拥有很高的声望,很多公司、组织、业界大犇都很喜欢她,Square公司的 JakeWharton 大神(Dagger、ButterKnife、Retrofit、OkHttp...之父)就专门写了篇Using Project Kotlin for Android为Kotlin站台。
相对Java来说,Kotlin在编写代码时有如下优势:代码简洁高效、函数式编程、空指针安全、支持lambda表达式、流式API等。
在执行效率上,Kotlin和Java具有同样的理论速度(都是编译成JVM字节码)。
另外,新语言必须考虑兼容性,为了与存量项目代码和谐共处,Kotlin和Java是互相完美兼容的,两种代码文件可以并存,代码可以互相调用、文件可以互相转换,库文件也可以无障碍地互相调用,据说使用Kotlin基本不会带来额外的成本负担。
编程语言本质上还是工具,要运用工具提高效率和质量 (鏈接:https://www.jianshu.com/p/bb53cba6c8f4)
它几乎可以在今天使用Java的任何地方使用:用于服务器端开发,Android应用程序等等。
Kotlin与所有现有的Java框架100%兼容,并且具有良好的工具支持。它是一种实用的语言,具有非常低的学习曲线,可以被Java开发人员快速掌握。 Kotlin代码不仅可以编译为JVM字节码,还可以编译为JavaScript和Native代码
package com.fooimport foo.Bar
import foo.*
fun sum(a: Int, b: Int): Int { return a + b
}fun sum(a: Int, b: Int) = a + b
fun localVariables() {
val a: Int = 1
val b = 1 // 自动推导类型为Int
val c: Int // 没有初始值时需要显式制定变量类型
c = 1 // 初始复制
// c = 2 这个是错误的,val定义的只读变量不可重新赋值}
val大致相当于Java里的final,C/C++里的const,Swift里的let,ES6中的const, 使用val定义的是不可重新赋值的变量。
fun mutableVariables() {
var x = 5 // 类型自动推导为Int
x += 1}
fun strTemplate() {
val name = "Miufox"
val age = 6 print("I have a cat, name is $name age:$age")
val a:Int = 2016
val b = 40 print("sum($a+$b) = ${a+b}")
var args = arrayOf("Cat", "Dog", "Rabbit") print("Hello ${args[0]}")
}
fun max(a: Int, b: Int): Int { if (a > b) return a else
return b
}
使用if表达式,上面的函数可以简化成这样
fun max(a: Int, b: Int) = if (a > b) a else b
fun cases(obj: Any) {
when (obj) {
1 -> print("One") "Hello" -> print("Greeting")
is Long -> print("Long")
!is String -> print("Not a string") else -> print("Unknown")
}
}
fun parseInt(str: String): Int? { // ...}
使用返回值可能为null的函数
fun testInt(args: Array<String>) { if (args.size < 2) {
print("Two integers expected") return
}
val x = parseInt(args[0]) // Int?
val y = parseInt(args[1])//Int?
if (x != null && y != null) { // null检查之后,这里自动类型转换为非空值
print(x * y)
}
}
fun getStringLength(obj: Any): Int? { if (obj is String) { // `obj` 自动转换为 `String`
return obj.length
} // 在类型检查的if分支外 obj依然是 `Any` 类型
return null}
下面的例子可能更清晰一些
fun getStringLength(obj: Any): Int? { if (obj !is String) return null
// `obj` 自动转换为 `String` 类型
return obj.length
}
甚至可以这样写
fun getStringLength(obj: Any): Int? { // && 右边 obj 已经自动转换为 String 类型
if (obj is String && obj.length > 0) return obj.length return null}
fun forLoop1(args: Array<String>) { for (arg in args) {
print(arg)
}
}
或者这样写,带下标遍历数组
fun forLoop2(args: Array<String>) { for (i in args.indices) {
print(args[i])
}
}
fun whileLoop1(args: Array<String>) { var i = 0
while (i < args.size){
print(args[i++])
}
}
fun range1(x: Int, y: Int) { if (x in 1..y - 1) { print("OK")
}
}
// 集合类型fun names1(names: Array<String>) { for (name in names) {
println(name)
}
}// 检查是否包含fun names2(text: String, names: Array<String>) { if (text in names) {
print("Yes")
}
}// 使用lambda表达式fun names3(names: Collection<String>) {
names.filter { it.startsWith("A") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { print(it) }
}
list.filter { it > 10 }.map { element -> element * 2 }
data class Customer(val name: String, val email: String)
会自动生成 getter/setter/equals/hashCode/toString/copy等
fun foo(a: Int = 0, b: String = "") { // do something}
fun filters(list: Collection<Int>) {
val positives1 = list.filter { x -> x > 0 } // 也可以这样
val positives2 = list.filter { it > 0 }
}
fun maps(map: Map<String, String>) { for ((k, v) in map) {
println("$k -> $v")
}
}
fun readOnlyList() {
val list = listOf("a", "b", "c") // list.add("d") 错误:不能修改元素}
fun readOnlyMap() {
val map1 = mapOf("a" to 1, "b" to 2, "c" to 3)
println(map1["a"]) // map2["key"] = 123 错误:不能修改元素}
fun Int.biggerThanTen(): Boolean { return this > 10}// 测试一下扩展函数fun extensions() { 100.biggerThanTen() 5.biggerThanTen()
}
object Singleton {
val name = "Name"}
//nullable用法fun testNullable() {
val files = File("Test").listFiles()
println(files?.size)
println(files?.size ?: "empty")
}
fun transform(color: String): Int { return when (color) { "Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
}
fun tryCatch() {
val result = try { // do something
} catch (e: ArithmeticException) { throw IllegalStateException(e)
} // Working with result}
fun ifExp(param: Int) {
val result = if (param == 1) { "one"
} else if (param == 2) { "two"
} else { "three"
}
}
class Turtle {
fun penDown() { } fun penUp() {} fun turn(degrees: Double) { } fun forward(pixels: Double) { }
}// 如果你要调用某个对象的多个函数,可以这样用fun withExp() {
val turtle = Turtle()
with(turtle) { //draw a 100 pix square
penDown() for (i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}
}
Type BitWidth
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8
fun conversation1() {
val a: Int? = 1 // Int 包装类型 (java.lang.Integer)
// val b: Long? = a // Long 包装类型 (java.lang.Long)
// print(a == b) // 结果是false,因为两者类型不一样
val b: Byte = 1 // OK, literals are checked statically
// val i: Int = b // ERROR
val i: Int = b.toInt() // OK: 显式转换}
所有的数字类型都支持下列转换
oByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
//数组的部分接口class Array<T> private constructor() {
val size: Int
fun get(index: Int): T
fun set(index: Int, value: T): Unit
fun iterator(): Iterator<T>// ...}
// 创建数组fun testArray1() {
val asc = Array(5, { i -> (i * i).toString() })
}// Kotlin的数组是不可变的(Java 的数组可变;泛型的协变,逆变)// 不允许将Array<String>赋值给Array<Any>// Kotlin还有ByteArray, ShortArray, IntArray等类型fun testArray2() {
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]
}
fun testString1(str: String) { for (c in str) {
println(c)
}
}
* 字符串字面量
fun testString2() {
val s = "Hello, world!\n"
// 或者三引号
val text = """
for (c in "foo")
print(c)
"""}
// 三引号
val text = """
for (c in "foo")
print(c)
"""
fun stringTemplate() {
val i = 10
val s = "i = $i" // evaluates to "i = 10"
val x = "abc"
val str = "$x.length is ${x.length}" // "abc.length is 3"
// 可以包含反义字符
val price = "${'$'}9.99"}
var a :String? = "a"a.?length
val a = a ?: ""
Kotlin 函数式编程
Kotlin 面向对象编程
Kotlin 强大的标准库
Kotlin 与 Java互操作
Kotlin Spring Boot 服务端开发
Kotlin JavaScript 开发
Kotlin 多平台开发
Kotlin Native
Kotlin 协程
Kotlin 响应式编程
国内第一Kotlin 开发者社区公众号,主要分享、交流 Kotlin 编程语言、Spring Boot、Android、React.js/Node.js、函数式编程、编程思想等相关主题。