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" }
相关推荐
2501_933670791 分钟前
经营财务岗技能栈拆解:Excel、SQL、BI、预算分析怎么准备
开发语言
数据狐(Datafox)25 分钟前
1688商品列表API接口解析(附 JSON 样例)
java·开发语言·数据库·爬虫·json
小灰灰搞电子1 小时前
Rust Once 、OnceLock、LazyLock 一次性初始化详解
开发语言·后端·rust
hqyjzsb1 小时前
规划工商管理大学成长:搭建四层能力体系,重视高阶的 AI 能力建设
开发语言·人工智能·python·microsoft·职场和发展·数据挖掘·业界资讯
for_ever_love__1 小时前
爬虫项目: 获取高分电影的数据总结
开发语言·python·学习
weixin_307779131 小时前
C++代码实现MATLAB中的ode23t函数功能
开发语言·c++·算法·matlab
君顾12 小时前
24小时自助健身房系统开发实战与完整指南
java·开发语言·健身房
syagain_zsx2 小时前
算法基础篇 · 02 高精度(C++ 题解)
开发语言·c++·学习·高精度
白远山2 小时前
无人自助健身平台搭建:从架构设计到设备联动的完整实战
java·开发语言·架构·需求分析
古法安卓3 小时前
Android-Fork 机制详解
android·java·android studio