Kotlin Playground: Edit, Run, Share Kotlin Code Online
資料: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:?
data class Person(val name: String, val age: Int?) // 沒有默認值fun main(args: Array<String>) {// 必須顯式傳入age參數,即使是nullval 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會根據上下文自動地去判斷類型
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"的含義
val oldest = persons.maxByOrNull { it.age ?: 0 }
it指代的就是前面調用maxByOrNull函數的這個對象?
函數式編程
頭等函數:把函數的一小段行為當作值來使用,并用一個變量保存它,把它當作參數傳遞或者作為其他函數的返回值
比如kotlin基礎【2】-CSDN博客
如when語句的返回值是一個變量,所以可以把when語句的值賦值給一個變量
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}
}
data class Person(val name: String, val age: Int? = null) // 這種寫法更靈活fun main(args: Array<String>) {// val是不可變變量,var是可變變量val persons = listOf(Person("Alice"), // 可以不指定age,默認nullPerson("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)
}
// 定義查找函數fun findPerson(predicate: (Person) -> Boolean): Person? {return persons.find(predicate)}// 正確定義函數fun findAlice() = findPerson { it.name == "Alice" }fun findBob() = findPerson { it.name == "Bob" }