第一阶段:Kotlin基础 (1-2周)必学语法
1. 变量声明:val/var,空安全
// val:不可变(类似Java的final) val name = "张三" // 自动推断类型 val age: Int = 25 // 显式指定类型 // var:可变 var score = 90 score = 95 // 可以修改 // 空安全:防止NullPointerException var userName: String? = null // 可为空 var userAge: String = "25" // 不可为空 // 安全调用 println(userName?.length) // 如果userName为null,返回null println(userAge.length) // 直接调用,不会为null // Elvis操作符 val length = userName?.length ?: 0 // 如果为null则返回0 val name: String? = null val result = name ?: "默认名称" // 结果是 "默认名称" val age: Int? = 25 val finalAge = age ?: 0 // 结果是 25 相当于 val result = if (name != null) name else "默认名称" [点击并拖拽以移动]
2. 函数定义:fun,默认参数,扩展函数
// 基础函数 fun greet(name: String): String { return "Hello, $name!" } // 单表达式函数 fun add(a: Int, b: Int) = a + b // 默认参数 fun createUser(name: String, age: Int = 18, city: String = "北京"): String { return "$name, $age岁, 来自$city" } // 调用:createUser("李四") 或 createUser("李四", 25) // 命名参数 createUser(name = "王五", city = "上海") // 扩展函数:为现有类添加方法 fun String.isEmail(): Boolean { return this.contains("@") && this.contains(".") } // 使用:val valid = "test@email.com".isEmail()
字符串扩展函数:
// isBlank() - 检查字符串是否为空或只包含空白字符 " ".isBlank() // true "hello".isBlank() // false // isNotEmpty() - 检查字符串是否不为空 "hello".isNotEmpty() // true "".isNotEmpty() // false // substringBefore() - 获取指定字符前的子串 "user@example.com".substringBefore("@") // "user" // substringAfter() - 获取指定字符后的子串 "user@example.com".substringAfter("@") // "example.com" // capitalize() - 首字母大写 (已废弃) // decapitalize() - 首字母小写 (已废弃) // 现在使用: "hello".replaceFirstChar { it.uppercase() } // "Hello"
集合扩展函数:
val numbers = listOf(1, 2, 3, 4, 5) // map() - 转换每个元素 numbers.map { it * 2 } // [2, 4, 6, 8, 10] // filter() - 过滤元素 numbers.filter { it > 3 } // [4, 5] // find() - 查找第一个符合条件的元素 numbers.find { it > 3 } // 4 // any() - 是否有任一元素符合条件 numbers.any { it > 4 } // true // all() - 是否所有元素都符合条件 numbers.all { it > 0 } // true // distinct() - 去重 listOf(1, 1, 2, 3).distinct() // [1, 2, 3] // take() - 取前n个元素 numbers.take(3) // [1, 2, 3] // drop() - 跳过前n个元素 numbers.drop(2) // [3, 4, 5]
作用域函数:
val person = Person("张三", 25) // let - 对非空对象执行操作,返回lambda结果 person?.let { println("姓名:${it.name}") it.age } // 返回25 // apply - 配置对象属性,返回对象本身 person.apply { name = "李四" age = 30 } // 返回修改后的person // also - 执行额外操作,返回对象本身 person.also { println("创建了:${it.name}") } // 返回person // run - 在对象上下文中执行代码块 person.run { "$name - $age岁" } // 返回字符串 // with - 非扩展函数,用于对象操作 with(person) { "$name - $age岁" }
数字扩展函数:
// coerceIn() - 限制数值范围 15.coerceIn(1, 10) // 10 (限制在1-10之间) // downTo - 递减范围 5 downTo 1 // 5, 4, 3, 2, 1 // until - 不包含结束值的范围 1 until 5 // 1, 2, 3, 4 // step - 设置步长 (1..10 step 2).toList() // [1, 3, 5, 7, 9]
3. 类与对象:data class,object,构造函数
// 普通类 class Person(val name: String, var age: Int) { // 次要构造函数 constructor(name: String) : this(name, 0) fun introduce() = "我是$name,今年$age岁" } // 使用主构造函数 val person1 = Person("张三", 25) // 使用次要构造函数 val person2 = Person("李四") // age自动为0 println(person1.introduce()) // "我是张三,今年25岁" println(person2.introduce()) // "我是李四,今年0岁" // 修改age属性 person2.age = 30 // 数据类:自动生成equals、hashCode、toString、copy data class User(val id: Int, val name: String, val email: String) val user1 = User(1, "张三", "zhang@example.com") val user2 = User(1, "张三", "zhang@example.com") val user3 = User(2, "李四", "li@example.com") println(user1 == user2) // true(内容相同) println(user1 == user3) // false(内容不同) val user = User(1, "张三", "zhang@example.com") println(user.hashCode()) // 基于id、name、email生成的哈希值 val user = User(1, "张三", "zhang@example.com") println(user.toString()) // 输出: User(id=1, name=张三, email=zhang@example.com) val user1 = User(1, "张三", "zhang@example.com") val user2 = user1.copy(name = "张三丰") // 只修改name val user3 = user1.copy(id = 2, email = "new@example.com") // 修改多个属性 println(user2) // User(id=1, name=张三丰, email=zhang@example.com) // object:单例 object DatabaseManager { fun connect() = println("连接数据库") fun disconnect() = println("断开连接") } // 使用:DatabaseManager.connect() // 伴生对象:类似Java的static class Calculator { companion object { fun pi() = 3.14159 const val VERSION = "1.0" } } // 使用:Calculator.pi() // 直接通过类名调用,不需要创建Calculator实例 val piValue = Calculator.pi() // 3.14159 val version = Calculator.VERSION // "1.0" // 不需要这样做: // val calc = Calculator() // val piValue = calc.pi() ❌ //Java写法: public class Calculator { public static double pi() { return 3.14159; } public static final String VERSION = "1.0"; } // 使用:Calculator.pi() //Kotlin写法: class Calculator { companion object { fun pi() = 3.14159 const val VERSION = "1.0" } } // 使用:Calculator.pi() //实际应用场景: class FileUtils { companion object { fun readFile(path: String): String { /* 实现 */ } fun writeFile(path: String, content: String) { /* 实现 */ } const val MAX_FILE_SIZE = 1024 * 1024 // 1MB } } // 使用 val content = FileUtils.readFile("data.txt") FileUtils.writeFile("output.txt", "Hello World") if (fileSize > FileUtils.MAX_FILE_SIZE) { /* 处理 */ } //工厂方法模式: data class User(val name: String, val email: String) { companion object { fun createAdmin(name: String) = User(name, "admin@company.com") fun createGuest() = User("Guest", "guest@temp.com") } } val admin = User.createAdmin("张三") val guest = User.createGuest()
4. 集合操作:map,filter,forEach
val numbers = listOf(1, 2, 3, 4, 5, 6) val users = listOf( User(1, "张三", "zhang@email.com"), User(2, "李四", "li@email.com"), User(3, "王五", "wang@email.com") ) // map:转换每个元素 val doubled = numbers.map { it * 2 } // [2, 4, 6, 8, 10, 12] val names = users.map { it.name } // ["张三", "李四", "王五"] // filter:筛选元素 val evenNumbers = numbers.filter { it % 2 == 0 } // [2, 4, 6] val emailUsers = users.filter { it.email.contains("@") } // forEach:遍历每个元素 numbers.forEach { println("数字: $it") } users.forEach { user -> println("用户: ${user.name}, 邮箱: ${user.email}") } // 链式操作 val result = numbers .filter { it > 3 } // [4, 5, 6] .map { it * 2 } // [8, 10, 12] .forEach { println(it) } // 打印每个结果 // 其他常用操作 val firstUser = users.first() // 第一个元素 val foundUser = users.find { it.name == "张三" } // 查找元素 val hasAdmin = users.any { it.name == "admin" } // 是否存在 val totalIds = users.sumOf { it.id } // 求和
实践建议
每日练习任务:
- 创建一个学生管理的数据类
- 写几个计算函数(加减乘除)
- 练习集合操作(筛选、转换数据)
- 尝试为String类添加扩展函数
小提示:
- 优先使用val,需要修改时才用var
- 善用空安全操作符?.和?:
- 多练习集合的链式操作,这在实际开发中很常用
(图片来源网络,侵删)(图片来源网络,侵删)(图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。