标准库内容

Kotlin的标准库大致包含这样几个部分:

  • 数据类型和集合
  • JS和Native平台相关SDK
  • JDK扩展方法,JVM平台已经非常成熟,所以主要是对JDK进行扩展
  • 其他语言特色

本课程主要面向Android开发者,AndroidSDK基于JDK,所以主要学习下JDK扩展方法中比较重要的部分。

IO扩展

标准版给File类增加了很多实用的扩展,IO操作在实际开发中占相当大的比重。

  • append系列

    val file = File("F:\\kotlin_space\\KotlinCoroutine\\src\\main\\kotlin\\a.txt")
    file.appendText("""
            床前明月光,疑是地上霜;
            举头望明月,低头思故乡。
        """.trimIndent())
    file.appendBytes("哈哈".toByteArray())
    
  • buffer系列

    //读取每行内容并打印
    file.bufferedReader().lineSequence().forEach {
        println(it)
    }
    //向文件写入
    file.bufferedWriter().apply {
        write("呵呵")
        write("嘻嘻")
        flush()
    }
    
  • copy系列

    //拷贝文件
    file.copyTo(File("F:\\kotlin_space\\KotlinCoroutine\\src\\main\\kotlin\\a-copy.txt"))
    //递归拷贝目录
    File("F:\\kotlin_space\\KotlinCoroutine\\src\\main\\kotlin")
                .copyRecursively(File("F:\\kotlin_space\\KotlinCoroutine\\src\\main\\kotlin-copy"))
    
  • 删除系列

    //删除整个目录
    File("F:\\kotlin_space\\KotlinCoroutine\\src\\main\\kotlin-copy").deleteRecursively()
    
  • 读取系列

    println(file.readBytes()) //读取字节
    file.readLines().forEach { println(it) } //直接读取所有行并打印
    println(file.readText())//以文本方式读取整个内容
    
  • 写入系列

    file.writeBytes("床前明月光".toByteArray()) //写入字节
    file.writeText("疑是地上霜") //写入文本
    
  • 其他

    println(file.extension) //文件扩展名
    println(file.nameWithoutExtension)//文件名
    file.forEachLine { println(it) } //直接遍历每一行
    file.forEachBlock { buffer, bytesRead -> println(bytesRead) } //读取字节块
    

    String扩展

    String处理在开发中也是不可或缺。

    val s = "abcde"
    println(s.indices) //获取字符下标的Range对象
    s.all { it!='e' } //所有字符都满足给定条件才是true
    s.any { it=='a' } //只要有一个字符满足条件就是true
    println(s.capitalize()) //首字母大写
    println(s.decapitalize()) //首字母小写
    println(s.repeat(3)) //重复几次
    "[a-zA-Z]+".toRegex().find(s) //转正则
    //还有各种查找,替换,过滤,map,reduce等函数,就不一一展示了...
    

    Sequence类型

    Sequence翻译过来叫序列,是一种延迟计算的集合,它有着和List,Set,Map一样的高阶函数。来看看如何使用序列:

    val list = mutableListOf("a", "bc", "bcda", "feec", "aeb")
    list.asSequence().forEach { println(it) }
    

    List,Set,Map,String都有asSequence()方法直接转为一个序列,看起来和集合没两样。我们用list和序列分别执行相同的逻辑,并计算他们的耗时:

    //序列的版本
    println(measureTimeMillis { list.asSequence().first { it.contains("f")} }) //18
    //list的版本
    println(measureTimeMillis { list.first { it.contains("f")} }) //0
    

    结果发现list比序列快多了!稳住,别急!

    我们将数据量增大,并将逻辑复杂化来看看:

    val list2 = mutableListOf<String>().apply {
            repeat(1000000){ //将数据量增加到100万
                add("abcdefg"[Random.Default.nextInt(7)].toString())
            }
        }
    println(measureTimeMillis { list2.asSequence().map { "${it}-aaa" }.filter { it.startsWith("a") } }) //19
    println(measureTimeMillis { list2.map { "${it}-aaa" }.filter { it.startsWith("a") } }) //136
    

    可以看到序列的性能比list提高了86%🚀!

    所以,如果你的场景满足以下两个条件,应该优先使用序列,否则都使用集合:

    1. 数据量超级大,百万级别
    2. 对数据集进行频繁的操作

    然而Android开发属于客户端开发,基本不太可能遇到这么大的数据量。一般是后台对大数据集进行处理好,返给我们,客户端顶一般都会分页加载,一次加载20条。所以,Sequence在Android开发中基本没有用武之地😥。

更新时间: 4/30/2019, 9:52:46 PM