专栏名称: 待字闺中
深度分析大数据、深度学习、人工智能等技术,切中实际应用场景,为大家授业解惑。间或,也会介绍国内外相关领域有趣的面试题。
目录
相关文章推荐
程序员小灰  ·  国庆节,推荐几位优秀的朋友! ·  5 天前  
程序员的那些事  ·  趣图:忘加 add 就 push 了 ·  1 周前  
程序员小灰  ·  稚晖君回来了,yyds !! ·  1 周前  
OSC开源社区  ·  打造一个Cursor只需要三步 ·  1 周前  
程序员的那些事  ·  开源软件的叛徒,加入了微软 ·  1 周前  
51好读  ›  专栏  ›  待字闺中

Kotlin--Java程序员的救世主

待字闺中  · 公众号  · 程序员  · 2017-09-01 09:10

正文

编程语言层出不穷,只统计JVM上的语言就有不下几十种。现在的一些新的语言,都有很多的语法特点、语法糖,让代码越来越短、越来越酷,这也让Java程序员羡慕不已。不过,Java8有一个巨大的进步,就是Stream API以及lambda表达式的引入,编程的思维有一定的进步,代码量一定程度减少,但是还不够。

其实,JVM上的Groovy、Clojure、Scala,以及Xtend,都有各自的特点,我也都相继写过一些项目,但都没有在团队中推广。直到遇到Kotlin,花了半天时间看了下内容,果断开始在一个项目中采用,项目上线之后,就在团队中推广开来。确实是看了半天就开始开发,有Java基础的话,就是这么快。我们这里并不是用Kotlin做Android的项目,而是后端的服务。Kotlin,有几个快速上手的保证点:

  • JetBrains出品,完美的IDE支持。如果开始语法不熟悉,可以直接拷贝粘贴,自动转换Java到Kotlin。

  • 和Java无缝集成,比Clojure,Scala等方便太多。

  • 完美满足Java程序员对函数编程的向往

Java与Kotlin的比较资料

  1. https://fabiomsr.github.io/from-java-to-kotlin/index.html

  2. https://fabiomsr.github.io/from-java-to-kotlin/functions.html

  3. https://fabiomsr.github.io/from-java-to-kotlin/classes.html

  4. https://stackoverflow.com/documentation/kotlin/topics

下面具体介绍一些,我们实践中觉得很好用的点。

包级方法,再也不用定义类(累)了。

fun main(args: Array) {
    println("Hello Kotlin!")

    sayHello("World")
}

fun sayHello(name: String) {
    println("Hello $name!")
}

集合框架的使用

  1. sortedBy/groupBy使用

  2. firstOrNull,注意如果集合为空,不能用first

  3. any,filter使用

  4. 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) {
        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) {
        "abc".printIt()
        1L.printIt()
        User("ABC", 1).printIt()
    }

    属性get, set的使用

    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) {
        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) {
        show("A")
        show("A", 2)
        show("A", 3, "男")
        show("A", gender = "男")
    }

    静态方法使用

    class Helper {
        companion object {
            fun showSomething() {
                println("Something")
            }
        }
    }
    
    fun main(args: Array) {
        Helper.showSomething()
    }

    一些小点

    • == 相当于equals

    • isNullOrBlank, string可以判断null

    • ?:操作
      示例:

    fun main(args: Array) {
        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) }
    }

    if/else try/cache when,比switch强大太多

    fun main(args: Array) {
        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)
    }

    变长参数 array to vargs

    fun printAll(vararg str: Any) {
        str.forEach {
            println(it)
        }
    }
    
    fun main(args: Array) {
        printAll("1", "2", "3")
        printAll()
    
        val abc = listOf("a", "b", "c")
        printAll(*abc.toTypedArray())
    }

    ?.let{}使用,减少null判断

    if (account.mobile != null) {
        account.mobile = "*****"
    }
    // 一行搞定
    account.mobile?.let { it = "******" }

    多行字符串,写SQL爽不爽!

    fun main(args: Array) {
        val str = """
            a
            b
            c
        """
    
        str.printIt()
    }

    字符串插值,终于可以这样写了!

    val a = "world"
    println("hello $a")

    try-with-resource的kotlin版本更容易

    @InlineOnly
    public inline fun  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()
            }
        }
    }