编程语言层出不穷,只统计JVM上的语言就有不下几十种。现在的一些新的语言,都有很多的语法特点、语法糖,让代码越来越短、越来越酷,这也让Java程序员羡慕不已。不过,Java8有一个巨大的进步,就是Stream API以及lambda表达式的引入,编程的思维有一定的进步,代码量一定程度减少,但是还不够。
其实,JVM上的Groovy、Clojure、Scala,以及Xtend,都有各自的特点,我也都相继写过一些项目,但都没有在团队中推广。直到遇到Kotlin,花了半天时间看了下内容,果断开始在一个项目中采用,项目上线之后,就在团队中推广开来。确实是看了半天就开始开发,有Java基础的话,就是这么快。我们这里并不是用Kotlin做Android的项目,而是后端的服务。Kotlin,有几个快速上手的保证点:
JetBrains出品,完美的IDE支持。如果开始语法不熟悉,可以直接拷贝粘贴,自动转换Java到Kotlin。
和Java无缝集成,比Clojure,Scala等方便太多。
完美满足Java程序员对函数编程的向往
https://fabiomsr.github.io/from-java-to-kotlin/index.html
https://fabiomsr.github.io/from-java-to-kotlin/functions.html
https://fabiomsr.github.io/from-java-to-kotlin/classes.html
https://stackoverflow.com/documentation/kotlin/topics
下面具体介绍一些,我们实践中觉得很好用的点。
fun main(args: Array<String>) {
println("Hello Kotlin!")
sayHello("World")
}
fun sayHello(name: String) {
println("Hello $name!")
}
sortedBy/groupBy使用
firstOrNull,注意如果集合为空,不能用first
any,filter使用
toMap
associateBy
map to
associate
使用.filterNotNull()
例子:
data class User(val name: String, val age: Int)
val users = listOf(User("A", 1), User("B", 2), User("C", 3), User("D", 3))
fun main(args: Array<String>) {
users.sortedBy { it.age }.reversed().forEach {
println(it)
}
users.groupBy { it.age }.forEach {
println(it)
}
println(users.any { it.age > 1 })
users.filter { it.age > 4 }.first()
println(users.filter { it.age > 4 }.firstOrNull())
println(users.associateBy { it.name })
println(users.map { it.name to it.age }.toMap())
println(users.associate { it.name to it })
users.map { it.name }
println(users.filterNotNull())
}
这应该可以评为最强大的功能
fun Any.printIt() = println(this.toString())
fun main(args: Array<String>) {
"abc".printIt()
1L.printIt()
User("ABC", 1).printIt()
}
class Page {
var page: Int = 1
set(value) {
if (value == null) {
throw IllegalArgumentException()
}
if (value < 1) {
throw IllegalArgumentException()
}
field = value
}
var size: Int = 20
get() = field * 20
override fun toString(): String {
return "Page(page=$page, size=$size)"
}
}
fun main(args: Array<String>) {
val page = Page()
page.page = -1
page.size = 2
page.printIt()
}
@JvmOverloads
fun show(name: String, age: Int = 1, gender: String = "男") {
println("name=$name, age=$age, gender=$gender")
}
fun main(args: Array<String>) {
show("A")
show("A", 2)
show("A", 3, "男")
show("A", gender = "男")
}
class Helper {
companion object {
fun showSomething() {
println("Something")
}
}
}
fun main(args: Array<String>) {
Helper.showSomething()
}
== 相当于equals
isNullOrBlank, string可以判断null
?:操作
示例:
fun main(args: Array<String>) {
val str1 = "abc"
val str2 = String("abc".toByteArray())
println(str1 == str2)
println(str1 === str2)
var str3: String? = null
println(str3.isNullOrBlank())
println(str3 ?: "empty string")
str3 = "1"
str3?.let { print(it) }
}
fun main(args: Array<String>) {
val a = 1
val b = 2
val c = if (a > b) a else b
println(c)
val d = when(a) {
1 -> 10
2 -> 20
else -> 0
}
println(d)
}
fun printAll(vararg str: Any) {
str.forEach {
println(it)
}
}
fun main(args: Array<String>) {
printAll("1", "2", "3")
printAll()
val abc = listOf("a", "b", "c")
printAll(*abc.toTypedArray())
}
if (account.mobile != null) {
account.mobile = "*****"
}
// 一行搞定
account.mobile?.let { it = "******" }
fun main(args: Array<String>) {
val str = """
a
b
c
"""
str.printIt()
}
val a = "world"
println("hello $a")
@InlineOnly
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
var closed = false
try {
return block(this)
} catch (e: Exception) {
closed = true
try {
this?.close()
} catch (closeException: Exception) {
}
throw e
} finally {
if (!closed) {
this?.close()
}
}
}