0. 序言
从入门到放弃,从放弃到痴迷,前者是因为kotlin的语言习惯和Java不同,后者是因为kotlin的新特性。
1. 初体验
data class Person(var name: String, var age: Int? = null)
var persons = listOf(Person("Green"), Person("Tom", age = 30))
val oldest = persons.maxBy { it.age ?: 0 }
println("The oldest is: $oldest")
06-05 07:07:55.339 9613-9613/com.best.chapter_01 I/System.out: The oldest is: Person(name=Tom, age=30)
说明:
① 声明了名为Person的数据类,它有两个属性:name和age。age属性默认为null(如果没有指定)。
② 创建Person的时候,省略了Green的年龄,即Green的age为null。
③ maxBy函数直接查找列表中年纪最大的那个"人",以前需要写很多代码搞定的事情,现在只需要一个Api。
④ 这里用到Lambda表达式,表达式需要一个参数,使用it作为这个参数的默认名称。如果age属性为null,Elvis运算符(?:)返回零。也就是Green的年龄为null,通过Elvis运算符指定年龄为0.
⑤ $的使用使得参数在字符串里面可以更快获得打印.
2. 主要特性
- 目标平台:
① 编写服务器端代码(典型的代表是Web应用后端)(暂时忽略)
② 创建Android设备上运行的移动应用 - 静态特性:
① 编译器检测异常:与动态类型编程语言(Groovy和JRuby)相比,编译期就能发现异常,避免了运行时异常.
② 类型推导:与Java相比,Kotlin不需要显示地声明每个变量的类型,变量类型可以根据上下文自动判断,这样就可以省略类型声明,避免额外冗长代码.
③ 可空类型:编译器检测可能存在的空指针异常,让程序更加稳定可靠. - 函数式编程
- 核心概念:
① 头等函数:
把函数当做值使用,可以用变量保存它,把它当做参数传递,或者当做其他函数的返回值.
② 不可变性:
使用不可变对象,保证它们的状态在创建之后不能再变化.即创建后类型就不能发生变化.
③ 无副作用:
使用的是纯函数:此类函数在输入相同时会产生同样的结果,并且不会修改其他对象的状态,也不会和外面的世界交互. - 好处:
① 简洁:
函数式风格的代码比相应的命令式风格的代码更优雅更简洁:把函数当作值可以让你获得更强大的抽象能力,从而避免重复代码.比如说Lambda表达式.
② 多线程安全:
多线程程序中最大的错误来源之一就是在没有采用适当同步机制的情况下,在不同的线程上修改同一份数据.如果你使用的是不可变数据结构和纯函数,就能保证这样不安全的修改根本不会发生,也就不需要考虑为其设计复杂的同步方案.
③ 测试更加容易:
没有副作用的函数可以独立进行测试,不必写写大量的设置代码来构造它们所依赖的整个环境.
- 核心概念:
3. 设计哲学
- 务实
① kotlin是一门设计出来解决现实世界问题的使用语言,经过了多年的实战测试.
② kotlin不是一门研究性语言,它依赖已经出现在其他编程语言中并被证明是成功的那些特性和解决方案.
③ kotlin没有强制使用某种特定的编程风格和范式,而是集流行语言优点之大成.
④ kotlin对工具的专注:开发语言的同时进行开发语言辅助工具的研发. - 简洁
简洁而不晦涩难懂的代码,可以让开发人员更快的了解代码的意思,开发更高效.
① 努力保证你写的代码都具有实际的意义.
② kotlin丰富的标准库允许你调用库方法代替冗长重复的代码块.
data class Customer(val name: String, val email: String, val company: String)
说明:使用一行代码创建一个包含 getters、 setters、 equals()、
hashCode()、 toString() 以及 copy() 的 POJO
val positiveNumbers = list.filter { it > 0 }
说明:lambda 表达式来过滤列表
object ThisIsASingleton {
val companyName: String = "JetBrains"
}
说明:单例创建一个 object 就可以了
- 安全
① 内存安全:
防止了缓冲区溢出以及其他错误的动态内存分配造成的问题。
② 类型安全和更低成本:
不需要指定所有的类型声明,编译器自动推断类型。
③ 努力消除空指针异常:
kotlin类型系统跟踪可以或不可以为null的值,并且禁止那些运行时可能导致空指针的操作.这所带来的额外成本极小:把类型标记为可空只要一个字符,就是类型尾部的一个问号:
var a: String = "abc"
a = null // 编译错误
var b: String? = "abc"
b = null // ok
val name: String? = null
println(name)
06-06 11:55:17.840 1761-1761/com.best.chapter_01 I/System.out: null
④ 努力避免类型转换异常:
一方面:当你把一个对象转换成一种类型,而没有事先检查它是否是正确的类型时,就会发生这个异常(Java中开发者常常忽略这类检查,因为必须反复地在检查和其后的转换中写明类型名称).
一方面:Kotlin检查和转换被组合成了一次操作:一旦检查过类型,不需要额外的转换就能直接引用属于这个类型的成员:
if (value is String) //检查类型
println(value?.toUpperCase()) //调用该类型的方法
- 互操作性
① 最大程度上使用了现有的Java库,让互操作性更加灵活,无任何额外开销.
② IDE工具跨语言工作:
1. 自由切换Java和Kotlin语言文件;
2. 可在不同语言编写的代码之中进行单步调试;
3. 重构java之后,kotlin代码对它们的调用随之更新。
4. 工具
- 在线PlayGround
地址: http://try.kotl.in
① 可以编写 编译 运行kotlin的程序,
② 可以看到kotlin in action(kotlin实战)这本书中所有的源代码. - Java到Kotlin转换器
① AndroidStudio里面我们找到一段java代码,只需选中,按Ctrl+Shift+Alt+K,就可以转换为kotlin代码,比如:
/**
* Created by FuKaiqiang on 2018-06-10.
*/
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* Created by FuKaiqiang on 2018-06-10.
*/
class Animal(var name: String?)
② 转换Java文件为Kotlin文件:快捷键Ctrl+Shift+A:输入Convert Java File to Kotlin File即可
5. 后续
如果大家喜欢这篇文章,欢迎点赞;如果想看更多前端移动端后端Java或Python方面的技术,欢迎关注!
网友评论