Skip to content

标准库

概述

Kotlin标准库提供了丰富的函数、类和扩展,涵盖集合操作、字符串处理、数学运算、I/O操作等各个方面。本章将详细介绍Kotlin标准库的核心功能和最佳实践。

集合操作函数

转换操作

kotlin
fun main() {
    println("=== 集合转换操作 ===")
    
    val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val words = listOf("apple", "banana", "cherry", "date", "elderberry")
    
    // map - 转换每个元素
    val squared = numbers.map { it * it }
    val lengths = words.map { it.length }
    val upperCase = words.map { it.uppercase() }
    
    println("原始数字: $numbers")
    println("平方: $squared")
    println("单词长度: $lengths")
    println("大写单词: $upperCase")
    
    // mapIndexed - 带索引的转换
    val indexedSquares = numbers.mapIndexed { index, value -> 
        "[$index]: ${value * value}" 
    }
    println("带索引的平方: $indexedSquares")
    
    // mapNotNull - 转换并过滤null
    val strings = listOf("1", "2", "abc", "4", "def")
    val validNumbers = strings.mapNotNull { it.toIntOrNull() }
    println("有效数字: $validNumbers")
    
    // flatMap - 扁平化映射
    val nestedLists = listOf(listOf(1, 2), listOf(3, 4), listOf(5, 6))
    val flattened = nestedLists.flatMap { it }
    println("扁平化: $flattened")
    
    // flatten - 直接扁平化
    val directFlattened = nestedLists.flatten()
    println("直接扁平化: $directFlattened")
    
    // associate - 创建映射
    val wordToLength = words.associate { it to it.length }
    val indexToWord = words.associateBy { it.first() }
    val wordToUpper = words.associateWith { it.uppercase() }
    
    println("单词到长度: $wordToLength")
    println("首字母到单词: $indexToWord")
    println("单词到大写: $wordToUpper")
}

过滤操作

kotlin
fun main() {
    println("=== 集合过滤操作 ===")
    
    val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val words = listOf("apple", "banana", "cherry", "date", "elderberry", "fig")
    val mixedList = listOf(1, "hello", 2.5, true, null, "world")
    
    // filter - 基本过滤
    val evenNumbers = numbers.filter { it % 2 == 0 }
    val longWords = words.filter { it.length > 5 }
    
    println("偶数: $evenNumbers")
    println("长单词: $longWords")
    
    // filterIndexed - 带索引的过滤
    val evenIndexElements = numbers.filterIndexed { index, _ -> index % 2 == 0 }
    println("偶数索引的元素: $evenIndexElements")
    
    // filterNot - 反向过滤
    val oddNumbers = numbers.filterNot { it % 2 == 0 }
    println("奇数: $oddNumbers")
    
    // filterNotNull - 过滤null值
    val nonNullItems = mixedList.filterNotNull()
    println("非null项: $nonNullItems")
    
    // filterIsInstance - 类型过滤
    val strings = mixedList.filterIsInstance<String>()
    val numbers2 = mixedList.filterIsInstance<Number>()
    
    println("字符串: $strings")
    println("数字: $numbers2")
    
    // partition - 分区
    val (evens, odds) = numbers.partition { it % 2 == 0 }
    println("分区 - 偶数: $evens, 奇数: $odds")
    
    // take/drop 系列
    val firstThree = numbers.take(3)
    val lastThree = numbers.takeLast(3)
    val withoutFirstThree = numbers.drop(3)
    val withoutLastThree = numbers.dropLast(3)
    
    println("前3个: $firstThree")
    println("后3个: $lastThree")
    println("去掉前3个: $withoutFirstThree")
    println("去掉后3个: $withoutLastThree")
    
    // takeWhile/dropWhile - 条件取舍
    val takeWhileSmall = numbers.takeWhile { it < 5 }
    val dropWhileSmall = numbers.dropWhile { it < 5 }
    
    println("取小于5的: $takeWhileSmall")
    println("丢弃小于5的: $dropWhileSmall")
}

聚合操作

kotlin
fun main() {
    println("=== 集合聚合操作 ===")
    
    val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val words = listOf("apple", "banana", "cherry", "date")
    val emptyList = emptyList<Int>()
    
    // 基本聚合
    println("数字列表: $numbers")
    println("求和: ${numbers.sum()}")
    println("平均值: ${numbers.average()}")
    println("最大值: ${numbers.maxOrNull()}")
    println("最小值: ${numbers.minOrNull()}")
    println("数量: ${numbers.count()}")
    
    // sumOf - 自定义求和
    val totalLength = words.sumOf { it.length }
    println("单词总长度: $totalLength")
    
    // maxBy/minBy - 按条件取最值
    val longestWord = words.maxByOrNull { it.length }
    val shortestWord = words.minByOrNull { it.length }
    
    println("最长单词: $longestWord")
    println("最短单词: $shortestWord")
    
    // reduce - 归约操作
    val product = numbers.reduce { acc, n -> acc * n }
    println("乘积: $product")
    
    // fold - 带初始值的归约
    val sumWithInitial = numbers.fold(100) { acc, n -> acc + n }
    val concatenated = words.fold("Words: ") { acc, word -> "$acc$word " }
    
    println("带初始值的求和: $sumWithInitial")
    println("连接字符串: $concatenated")
    
    // 安全操作(处理空集合)
    println("空列表最大值: ${emptyList.maxOrNull()}")
    println("空列表求和: ${emptyList.sum()}")
    
    // reduceOrNull/foldOrNull - 安全的归约
    val safeProduct = emptyList.reduceOrNull { acc, n -> acc * n }
    println("空列表安全乘积: $safeProduct")
    
    // 分组聚合
    val groupedByLength = words.groupBy { it.length }
    val lengthCounts = words.groupingBy { it.length }.eachCount()
    
    println("按长度分组: $groupedByLength")
    println("长度计数: $lengthCounts")
    
    // 复杂聚合示例
    data class Student(val name: String, val grade: Int, val subject: String)
    
    val students = listOf(
        Student("Alice", 85, "Math"),
        Student("Bob", 92, "Math"),
        Student("Charlie", 78, "Science"),
        Student("Diana", 95, "Math"),
        Student("Eve", 88, "Science")
    )
    
    val mathAverage = students
        .filter { it.subject == "Math" }
        .map { it.grade }
        .average()
    
    val topStudent = students.maxByOrNull { it.grade }
    val subjectAverages = students
        .groupBy { it.subject }
        .mapValues { (_, students) -> students.map { it.grade }.average() }
    
    println("数学平均分: ${"%.1f".format(mathAverage)}")
    println("最高分学生: ${topStudent?.name} (${topStudent?.grade})")
    println("各科平均分: $subjectAverages")
}

字符串操作

字符串处理函数

kotlin
fun main() {
    println("=== 字符串处理函数 ===")
    
    val text = "  Hello, Kotlin World!  "
    val multilineText = """
        Line 1
        Line 2
        Line 3
    """.trimIndent()
    
    // 基本操作
    println("原始文本: '$text'")
    println("长度: ${text.length}")
    println("去空格: '${text.trim()}'")
    println("大写: ${text.uppercase()}")
    println("小写: ${text.lowercase()}")
    
    // 检查操作
    println("是否为空: ${text.isEmpty()}")
    println("是否为空白: ${text.isBlank()}")
    println("包含'Kotlin': ${text.contains("Kotlin")}")
    println("以'Hello'开头: ${text.startsWith("Hello")}")
    println("以'!'结尾: ${text.endsWith("!")}")
    
    // 查找操作
    println("'Kotlin'的位置: ${text.indexOf("Kotlin")}")
    println("最后一个'l'的位置: ${text.lastIndexOf("l")}")
    
    // 替换操作
    println("替换'Kotlin'为'Java': ${text.replace("Kotlin", "Java")}")
    println("替换第一个'l': ${text.replaceFirst("l", "L")}")
    
    // 分割操作
    val parts = text.trim().split(" ")
    println("分割结果: $parts")
    
    val csvData = "apple,banana,cherry"
    val fruits = csvData.split(",")
    println("CSV分割: $fruits")
    
    // 子字符串操作
    println("子字符串[2,7]: '${text.substring(2, 7)}'")
    println("从索引7开始: '${text.substring(7)}'")
    
    // 多行文本处理
    println("多行文本:")
    println(multilineText)
    
    val lines = multilineText.lines()
    println("行数: ${lines.size}")
    println("各行: $lines")
    
    // 字符串构建
    val builder = StringBuilder()
    builder.append("Hello")
    builder.append(" ")
    builder.append("World")
    println("StringBuilder结果: $builder")
    
    // 使用buildString
    val builtString = buildString {
        append("Kotlin")
        append(" is")
        append(" awesome!")
    }
    println("buildString结果: $builtString")
}

字符串模板和格式化

kotlin
fun main() {
    println("=== 字符串模板和格式化 ===")
    
    val name = "Alice"
    val age = 25
    val score = 95.5
    
    // 基本字符串模板
    println("姓名: $name")
    println("年龄: $age")
    println("分数: $score")
    
    // 表达式模板
    println("明年年龄: ${age + 1}")
    println("姓名长度: ${name.length}")
    println("是否成年: ${age >= 18}")
    
    // 复杂表达式
    val message = "用户 $name (${age}岁) 的分数是 $score${if (score >= 90) " - 优秀!" else ""}"
    println(message)
    
    // 原始字符串模板
    val json = """
        {
            "name": "$name",
            "age": $age,
            "score": $score
        }
    """.trimIndent()
    printl

本站内容仅供学习和研究使用。