kotlin基础【3】

Kotlin Playground: Edit, Run, Share Kotlin Code Online

资料:kotlin实战 第一章

Kotlin 复制代码
data class Person(val name: String,val age:Int?=null)
    //允许接受以age为空,当为空将它赋值为null,如果不这么写直接写age:Int?是否可以
    fun main(args:Array<String>){
        //经过上一章学习,val指的是可变变量
        val persons = listOf(Person("Alice"),Person("Bob",age = 29))
        val oldest = persons.maxByOrNull{it.age?:0}
        println("The oldest is :$oldest")
   }

如果将 age 参数改为age:Int?(不提供默认值),则创建对象时必须显式传入 age:

Kotlin 复制代码
data class Person(val name: String, val age: Int?) // 没有默认值

fun main(args: Array<String>) {
    // 必须显式传入age参数,即使是null
    val persons = listOf(Person("Alice", null), Person("Bob", 29))
    val oldest = persons.maxByOrNull { it.age ?: 0 }
    println("The oldest is :$oldest")
}

代码分析

listOf()函数解释:

listOf()函数是Kotlin标准库中的函数,用于创建一个不可变的列表,和上一章的setOf()相似

它返回一个包含这些参数的列表

这个列表创建后,不能添加、删除或替换元素(不可变特性)

自动推断类型

这一点我们在之前的章节以经提到过,kt会根据上下文自动地去判断类型

Kotlin 复制代码
val persons = listOf(Person(...), Person(...))

在这里会自动推断类型为List<Person>

Kotlin具有类型推断能力,不需要显式声明变量类型

maxByOrNull()函数

这是集合(Collection)包括了Set List的扩展函数,用于找出集合中根据指定条件计算后最大值的元素,它接收一个lambda表达式({ it.age ?: 0 })作为参数,这个lambda定义了排序的依据

it代表集合中的每个元素(这里是Person对象)it.age ?: 0表示:如果age不为null则使用age的值,否则使用0(空安全处理)如果集合为空,该函数会返回null,这也是它名字中"OrNull"的含义

Kotlin 复制代码
 val oldest = persons.maxByOrNull { it.age ?: 0 }

it指代的就是前面调用maxByOrNull函数的这个对象

函数式编程

头等函数:把函数的一小段行为当作值来使用,并用一个变量保存它,把它当作参数传递或者作为其他函数的返回值

比如kotlin基础【2】-CSDN博客

如when语句的返回值是一个变量,所以可以把when语句的值赋值给一个变量

Kotlin 复制代码
var data = when (it.dataCategory) {
    CategoryTypeConfig.TYPE_FIRST_SYSTEM -> {
        DataSourceConstants.SOURCE_PRIMARY_SYSTEM
    }
 
    CategoryTypeConfig.TYPE_SECONDARY_TOOL -> {
        DataSourceConstants.SOURCE_AUXILIARY_TOOL
    }
 
    CategoryTypeConfig.TYPE_THIRD_PARTY -> {
        DataSourceConstants.SOURCE_EXTERNAL_MODULE
    }
 
    else -> {
        DataSourceConstants.SOURCE_EXTERNAL_MODULE
    }
}
Kotlin 复制代码
data class Person(val name: String, val age: Int? = null)  // 这种写法更灵活

fun main(args: Array<String>) {
    // val是不可变变量,var是可变变量
    val persons = listOf(
        Person("Alice"),  // 可以不指定age,默认null
        Person("Bob", age = 29)
    )
    
    // 定义查找函数
    fun findPerson(predicate: (Person) -> Boolean): Person? {
        return persons.find(predicate)
    }
    
    // 正确定义函数
    fun findAlice() = findPerson { it.name == "Alice" }
    fun findBob() = findPerson { it.name == "Bob" }
    
    // 正确调用
    val alice = findAlice()
    val bob = findBob()
    
    println("Alice: $alice")  // 输出 Alice: Person(name=Alice, age=null)
    println("Bob: $bob")      // 输出 Bob: Person(name=Bob, age=29)
}
Kotlin 复制代码
    // 定义查找函数
    fun findPerson(predicate: (Person) -> Boolean): Person? {
        return persons.find(predicate)
    }
    
    // 正确定义函数
    fun findAlice() = findPerson { it.name == "Alice" }
    fun findBob() = findPerson { it.name == "Bob" }
相关推荐
Kapaseker28 分钟前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴1 小时前
Android17 为什么重写 MessageQueue
android
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android