第一阶段:Kotlin基础 (1-2周)必学语法

06-01 1203阅读
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 }             // 求和

实践建议

每日练习任务:

  1. 创建一个学生管理的数据类
  2. 写几个计算函数(加减乘除)
  3. 练习集合操作(筛选、转换数据)
  4. 尝试为String类添加扩展函数

小提示:

  • 优先使用val,需要修改时才用var
  • 善用空安全操作符?.和?:
  • 多练习集合的链式操作,这在实际开发中很常用
    第一阶段:Kotlin基础 (1-2周)必学语法
    (图片来源网络,侵删)
    第一阶段:Kotlin基础 (1-2周)必学语法
    (图片来源网络,侵删)
    第一阶段:Kotlin基础 (1-2周)必学语法
    (图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码