编程界小小白一枚,平时刷刷知乎看看博客,偶发性遇见GitChat这个文:
https://mp.weixin.qq.com/s/K6NTWV9gth8Ge-eDvTzWfQ
于是,顺带科普了一下自己
[ 先上Kotlin语言中文版文档:https://www.gitbook.com/book/hltj/kotlin-reference-chinese/details ]
Kotlin的来历
Kotlin的作者是大名鼎鼎的Jetbrains公司。它有一系列耳熟能详的产品,诸如Android Studio, IntelliJ IDEA, 还有前端的WebStorm, PhpStorm。
终于有一天,勤劳的IDEA工程师,在踩了那么多Java的天坑之后,奋起推出了Kotlin
2011年7月,JetBrains推出Kotlin项目。
2012年2月,JetBrains以Apache 2许可证开源此项目。
2016年2月15日,Kotlin v1.0(第一个官方稳定版本)发布。
2017 Google I/O 大会,Kotlin 转正。
亮点
阅读了一些文献后,个人感觉,Kotlin最大的亮点便是可以和Java无缝衔接(虽然它Jvm上的兄弟Groovy,Scala也能做到)。这也就意味着,我们不但拥有原来java中所有的资源,还能体验到js般丝滑的编程体验。
最喜欢的part~列举几个语法糖~~
类的简化,隐式getter()、setter()
接口的默认实现
lambda与高阶函数
空指针安全,编译时期的空指针检查
流式集合操作 map(), forEach()
1.类的定义
// java bean
class People{
private String name;
public People(String name){
this.name = name;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
// kotlin bean
class People(val name: String){}
大大简化get() set() 有木有 终于节省生命了的感觉... 可以看到同样的数据实体,在kotlin中简化至1行。变量定义和构造函数合并,同时提供隐式的getter()、setter()。
2.继承
// 所有类默认final,要显式指定为open才可被继承
open class People(val name: String){}
// Code: People 表示继承关系
class Coder(name: String, val language: String = "Kotlin"): People(name){
override fun toString(): String {
return "name: $name, language: $language"
}
}
// 可执行的main()方法
fun main(args: Array<String>) {
val coder = Coder("Tom")
println(coder)
}
// 输出: name: Tom, language: Kotlin
data class People(val name: String){}
在看Effective Java的时候,总是对如何正确重写hashCode(),equals(),clone()感到棘手。然而他们又是正确使用Collection的关键所在(无论是HashMap、ArrayList)。 Kotlin专门提供了一个data class,来自动生成hashCode(),equals(),clone()。
顾名思义,它便是指接口可以和抽象类一样,有方法体的默认实现。 我把它归结在语法糖里,是因为java8中早已有了一模一样的东西,对应的关键字叫default。看起来抽象类好像可以退休了,实则不然。接口依然只是接口,不能拥有属性,只是在方法定义上更加灵活了。
interface A {
fun foo() { println("A") } // 默认实现, 打印"A"
fun bar()
}
interface B {
fun foo() { println("B") }
fun bar() { println("bar") }
}
// 多继承时,显式指定 super<A>.foo() 以去冲突
class D : A, B {
override fun foo() {
super<A>.foo()
super<B>.foo()
}
override fun bar() {
super.bar()
}
}
5.lambda与高阶函数
// new 一个线程
// 匿名类写法
val runnable1 = object : Runnable{
override fun run() {
println("I'm an anonymous class")
}
}
// 函数写法, 略像js
val runnable2 = fun (){
println("I'm a function")
}
// lambda写法1
val runnable3 = Runnable { ->
println("I'm a Lambda")
}
// lambda写法2
val runnable4 = { println("I'm a Lambda") }
Thread(runnable4).start()
6.空指针函数
你也许会想空指针不是很简单的东西吗,加个if(xxx != null)判断就好了。事实上,空指针绝对是出现频率最高,最讨厌的问题。而空安全则是kotlin主打的一个特性之一。在java8中,我们可以借助Optional勉强做到这一点。
var mNullable: String? = null
var mNonNull: String = "mNonNull"
fun testNull(){
println("testNull: ")
println(mNullable?.length)
println(mNonNull.length)
println()
}
// 输出:
testNull:
null
8
// kotlin定义变量时区分两种类型:
// var mNullable: Any? = null 可空
// var mNonNull: Any = XXX 非空
//1.对一个 mNullable 你可以像普通的java类一样使用:
// java 风格,判空
if(mNullable != null)
mNullable.length
// kotlin 语法糖,判空(推荐)
mNullable?.length
//2.对一个 mNonNull 则有严格的限制:
// 不必判空,因为必然非空
mNonNull.length
// 编译错误(试图给非空值赋予null)
mNonNull = null
// 编译错误(试图给非空值赋予可空值)
mNonNull = mNullable
7.流式操作 map(), forEach()
fun main(args: Array<String>){
val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
list.filter { it%2==0 } // 取偶数
.map{ it*it } // 平方
.sortedDescending() // 降序排序
.take(3) // 取前 3 个
.forEach { println(it) } // 遍历, 打印
}
// 输出:
100
64
36
附上Kotlin maven配置
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<version>${kotlin.version}</version>
<scope>test</scope>
</dependency>
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration/>
<executions>
<execution>
<id>compile</id>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>process-test-sources</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
嗯嗯~ Kotlin 慢慢学啦~