【Kotlin】Kotlin 语言集合中的高阶函数详解 ( 数据类 data class | maxBy | minBy | filter | map | any | count | find )
文章目錄
- I . List 集合高階函數引入
- II . Kotlin 數據類 ( data class )
- III . Java 代碼 與 Kotlin 代碼實現對比 ( 查詢年齡最大的 )
- IV . maxBy 高階函數
- V . minBy 高階函數
- VI . filter 高階函數
- VII . map 高階函數
- VIII . any 高階函數
- IX . count 高階函數
- X . find 高階函數
- XI . Kotlin 語言集合中的高階函數 代碼示例
I . List 集合高階函數引入
1 . 高階函數 : 函數的 參數 或 返回值類型 是 函數類型 的 函數 , 是高階函數 ;
2 . List 集合中定義的高階函數 : List 集合中使用了大量的高階函數 , 如 maxBy , filter , map , any , count , find , groupBy 等函數 , 這些函數的參數都是 函數類型的 , 需要傳入一個函數類型實例作為其參數 ;
II . Kotlin 數據類 ( data class )
1 . 數據類介紹 : Kotlin 中 data class 類能快速幫助開發者封裝 各種類型的數據 , 編譯后生成的 JavaBean 只生成最基本的幾個函數 , 如 hashCode() , toString() , copy() 等 ;
2 . 數據類型 ( data class ) 定義 :
① 參數格式 : 定義數據類時需要將要封裝的字段寫在構造函數中 , 格式如下 :
var / val 變量名 : 變量類型② 參數要求 : 構造函數必有 >= 1 個參數 , 參數格式必須按照上述格式聲明 ;
③ 修飾 : data class 不能被 abstract / inner / open / sealed 修飾 ;
④ 繼承關系 : data class 可以實現接口 , 在 1.1 版本后 , 可以繼承 ;
3 . Kotlin 數據類 功能 :
① 變量相關 : 自動生成成員變量 , 及對應的 getter 和 setter 方法 ;
③ 基本方法 : 自動生成 equals() , hashCode() , toString() , componentN() , copy() 等方法 ;
4 . Kotlin 數據類 實例 :
data class Student(var name : String, var age : Int, var height : Int)5 . JavaBean 參考 : 上面定義的 Kotlin 數據類 , 與下面的 JavaBean 基本一致 , 實現的那一串方法就算了 ;
public class Student {private String name;private int age;private int height;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;} }這個數據類節省了很多行代碼 ;
III . Java 代碼 與 Kotlin 代碼實現對比 ( 查詢年齡最大的 )
1 . 聲明 List 集合 :
data class Student(var name : String, var age : Int, var height : Int)var students : List<Student> = listOf<Student>(Student("Tom", 12, 190),Student("Jerry", 18, 165),Student("Trump", 18, 178),Student("Jack", 29, 165) )2 . 按照 Java 代碼的邏輯實現找找年齡最大的學生 : 先找出最大年齡 , 然后遍歷找出最大年齡的學生 ;
/*** 篩選出 students 中 18 歲的學生 , 并打印出來** 這是按照 Java 代碼的邏輯寫的*/ fun filterByAge(age : Int){// 1 . 先創建一個集合var filterStudents : ArrayList<Student> = ArrayList<Student>()// 2 . 遍歷 students 集合 , 并將 18 歲的篩選出來for (student in students){if(student.age == age){filterStudents.add(student);}}// 3 . 打印篩選出的學生for(student in filterStudents){println("${student.name} , ${student.age} , ${student.height}")}}3 . 使用 maxBy 高階函數實現同樣的功能 : 代碼要比上面精簡很多 , 因此在 Kotlin 中使用高階函數 , 能極大提高開發效率 ;
// 獲取年齡最大的學生 var maxAgeStudent = students.maxBy { it.age } println(maxAgeStudent)IV . maxBy 高階函數
maxBy 函數原型 : 獲取集合中某個元素的某個字段最大值的元素 , 如果有多個最大值元素 , 那么返回第一個 ;
/*** Returns the first element yielding the largest value of the given function or `null` if there are no elements.* * @sample samples.collections.Collections.Aggregates.maxBy*/ public inline fun <T, R : Comparable<R>> Iterable<T>.maxBy(selector: (T) -> R): T? {val iterator = iterator()if (!iterator.hasNext()) return nullvar maxElem = iterator.next()if (!iterator.hasNext()) return maxElemvar maxValue = selector(maxElem)do {val e = iterator.next()val v = selector(e)if (maxValue < v) {maxElem = emaxValue = v}} while (iterator.hasNext())return maxElem }2 . maxBy 函數的幾個要素 :
Iterable<T>.maxBy(selector: (T) -> R): T?① 函數調用者 : maxBy 函數是被 Iterable<T> 對象調用的 , 該對象是一個集合 ;
② 函數的參數 : selector: (T) -> R 是函數參數 ;
③ 函數返回值 : 返回值是 T? 類型 , 后面的 ? 表示返回值不為空 ; T 類型是一個泛型 , 是集合中元素的類型 ;
3 . maxBy 參數解析 : selector: (T) -> R , 這是一個函數類型參數 ; selector 是 選擇器 含義 ;
① selector : 函數類型變量名 ;
② (T) -> R 是函數參數類型 : 該函數類型的參數是 T 類型 , T 是集合元素類型 ; 返回值是 R 類型 , 表示 T 類型的某個字段 ;
4 . maxBy 高階函數對函數類型參數的使用 : 傳入一個函數類型變量 selector: (T) -> R , 該函數類型變量通過 selector(T) 進行調用 , 在 maxBy 中通過該函數類型變量 , 調用該變量對應的函數 , 實現了獲取 T 對象某個字段最大值元素的功能 ;
5 . maxBy 高階函數示例 :
① 代碼示例 :
data class Student(var name : String, var age : Int, var height : Int)var students : List<Student> = listOf<Student>(Student("Tom", 12, 190),Student("Jerry", 18, 165),Student("Trump", 18, 178),Student("Jack", 29, 165) )//...// 獲取年齡最大的學生 var maxAgeStudent = students.maxBy { it.age } println(maxAgeStudent)② 執行結果 :
Student(name=Jack, age=29, height=165)V . minBy 高階函數
minBy 與 maxBy 基本類似 , maxBy 是獲取元素某字段最大值的第一個元素 , minBy 是獲取元素某字段最小值的第一個元素
minBy 函數原型 : 獲取集合中某個元素的某個字段最小值的元素 , 如果有多個最小值元素 , 那么返回第一個 ;
/*** Returns the first element yielding the smallest value of the given function or `null` if there are no elements.* * @sample samples.collections.Collections.Aggregates.minBy*/ public inline fun <T, R : Comparable<R>> Iterable<T>.minBy(selector: (T) -> R): T? {val iterator = iterator()if (!iterator.hasNext()) return nullvar minElem = iterator.next()if (!iterator.hasNext()) return minElemvar minValue = selector(minElem)do {val e = iterator.next()val v = selector(e)if (minValue > v) {minElem = eminValue = v}} while (iterator.hasNext())return minElem }2 . minBy 函數的幾個要素 :
Iterable<T>.minBy(selector: (T) -> R): T?① 函數調用者 : minBy 函數是被 Iterable<T> 對象調用的 , 該對象是一個集合 ;
② 函數的參數 : selector: (T) -> R 是函數參數 ;
③ 函數返回值 : 返回值是 T? 類型 , 后面的 ? 表示返回值不為空 ; T 類型是一個泛型 , 是集合中元素的類型 ;
3 . minBy 參數解析 : selector: (T) -> R , 這是一個函數類型參數 ; selector 是 選擇器 含義 ;
① selector : 函數類型變量名 ;
② (T) -> R 是函數參數類型 : 該函數類型的參數是 T 類型 , T 是集合元素類型 ; 返回值是 R 類型 , 表示 T 類型的某個字段 ;
4 . minBy 高階函數對函數類型參數的使用 : 傳入一個函數類型變量 selector: (T) -> R , 該函數類型變量通過 selector(T) 進行調用 , 在 minBy 中通過該函數類型變量 , 調用該變量對應的函數 , 實現了獲取 T 對象某個字段最小值元素的功能 ;
5 . minBy 高階函數示例 :
① 代碼示例 :
data class Student(var name : String, var age : Int, var height : Int)var students : List<Student> = listOf<Student>(Student("Tom", 12, 190),Student("Jerry", 18, 165),Student("Trump", 18, 178),Student("Jack", 29, 165) )//...// 獲取身高最低的學生 var minHeightStudent = students.minBy { it.height } println(minHeightStudent)② 執行結果 :
Student(name=Jerry, age=18, height=165)VI . filter 高階函數
filter 函數原型 : 返回 List 集合 , 該集合中的元素全部符合傳入的 predicate: (T) -> Boolean 類型函數要求 , 即執行該 (T) -> Boolean 類型函數 , 傳入 T 元素對象 , 返回值為 true ; 傳入一個函數 , 該函數判定集合中的每個元素是否符合某種要求 ;
/*** Returns a list containing only elements matching the given [predicate].*/ public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {return filterTo(ArrayList<T>(), predicate) }2 . filter 函數的幾個要素 :
Iterable<T>.filter(predicate: (T) -> Boolean): List<T>① 函數調用者 : filter 函數是被 Iterable<T> 對象調用的 , 該對象是一個集合 ;
② 函數的參數 : predicate: (T) -> Boolean 是函數參數 ;
③ 函數返回值 : 返回值是 List 類型 , 是一個 泛型為 T 類型的 List 集合 ;
3 . filter 參數解析 : predicate: (T) -> Boolean , 這是一個函數類型參數 ; predicate 是 謂詞 含義;
① predicate : 函數類型變量名 ;
② (T) -> Boolean 是函數參數的類型 : 該函數類型的參數是 T 類型 , T 是集合元素類型 ; 返回值是 Boolean 類型 , 表示 T 類型是否符合某種要求 , 符合該要求才會將該元素放到 filter 方法返回值集合中 ;
4 . filter 高階函數對函數類型參數的使用 : 傳入一個函數類型變量 predicate: (T) -> Boolean , 該函數類型變量通過 predicate(T) 進行調用 , 執行該函數返回 true 的元素 , 會被放到 filter 方法返回值集合中 ;
5 . filter 高階函數示例 :
① 代碼示例 :
data class Student(var name : String, var age : Int, var height : Int)var students : List<Student> = listOf<Student>(Student("Tom", 12, 190),Student("Jerry", 18, 165),Student("Trump", 18, 178),Student("Jack", 29, 165) )//...// 篩選出年齡大于 15 , 并且身高小于 180 的學生 , 其返回值是一個集合 // 后面可以有多個 and 連接多個判斷語句 var ageH15HeightLow180 = students.filter {(it.age > 15 ) and (it.height < 180) } println(ageH15HeightLow180)② 執行結果 :
[Student(name=Jerry, age=18, height=165), Student(name=Trump, age=18, height=178), Student(name=Jack, age=29, height=165)]VII . map 高階函數
map 函數原型 : 返回 List<R> 集合 , 該集合中的元素的類型是一個生成的新類型 , 該類型是根據原來的集合 List<T> 元素進行轉換映射成的新類型 ; 傳入一個函數 , 該函數將集合中的每個元素進行某種轉換 , 產生一個新類型元素 ;
/*** Returns a list containing the results of applying the given [transform] function* to each element in the original collection.* * @sample samples.collections.Collections.Transformations.map*/ public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform) }2 . map 函數的幾個要素 :
Iterable<T>.map(transform: (T) -> R): List<R>① 函數調用者 : map 函數是被 Iterable<T> 對象調用的 , 該對象是一個集合 ;
② 函數的參數 : transform: (T) -> R 是函數參數 ;
③ 函數返回值 : 返回值是 List 類型 , 是一個 泛型為 R 類型的 List 集合 ; 該 R 類型是生成的新類型 ;
3 . map 參數解析 : transform: (T) -> R , 這是一個函數類型參數 ; transform 有 轉換變換 含義;
① transform : 函數類型變量名 ;
② (T) -> R 是函數參數的類型 : 該函數類型的參數是 T 類型 , T 是集合元素類型 ; 返回值是 R 類型 , 將 T 類型元素轉換成 R 類型 ;
4 . map 高階函數對函數類型參數的使用 : 傳入一個函數類型變量 transform: (T) -> R , 該函數類型變量通過 transform(T) 進行調用 , 執行該函數返回 R 類型元素 , map 的返回值就是這些 R 類型元素的 List<R> 集合 ;
5 . map 高階函數示例 :
① 代碼示例 :
data class Student(var name : String, var age : Int, var height : Int)var students : List<Student> = listOf<Student>(Student("Tom", 12, 190),Student("Jerry", 18, 165),Student("Trump", 18, 178),Student("Jack", 29, 165) )//...//將 Student 對象中的 姓名 和 年齡抽取出來 , 拼接成 "姓名 : 年齡" 字符串, 放到一個新的 字符串集合中 var studentNameAgess = students.map {"${it.name} : ${it.age}" } println(studentNameAgess)② 執行結果 :
[Tom : 12, Jerry : 18, Trump : 18, Jack : 29]VIII . any 高階函數
any 函數原型 : 返回該集合中是否存在某個元素 ; 傳入一個函數 , 該函數判定集合中的每個元素是否符合某種要求 ;
/*** Returns `true` if at least one element matches the given [predicate].* * @sample samples.collections.Collections.Aggregates.anyWithPredicate*/ public inline fun <T> Iterable<T>.any(predicate: (T) -> Boolean): Boolean {if (this is Collection && isEmpty()) return falsefor (element in this) if (predicate(element)) return truereturn false }2 . any 函數的幾個要素 :
Iterable<T>.any(predicate: (T) -> Boolean): Boolean① 函數調用者 : any 函數是被 Iterable<T> 對象調用的 , 該對象是一個集合 ;
② 函數的參數 : predicate: (T) -> Boolean 是函數參數 ;
③ 函數返回值 : 返回值是 Boolean 類型 , 該集合中如果存在符合某種條件的元素 , 返回 true , 否則返回 false ;
3 . any 函數類型參數解析 : predicate: (T) -> Boolean , 這是一個函數類型參數 ; predicate有 謂詞 含義;
① predicate: 函數類型變量名 ;
② (T) -> Boolean 是函數參數的類型 : 該函數類型的參數是 T 類型 , T 是集合元素類型 ; 返回值是 Boolean 類型 , 函數的執行內容 : 如果 T 類型參數符合函數中的要求 , 返回 true , 反之返回 false ;
4 . any 高階函數對函數類型參數的使用 : 傳入一個函數類型變量 predicate: (T) -> Boolean , 該函數類型變量通過 predicate(T) 進行調用 , 執行該函數返回 Boolean 值 , 表示該 T 類型對象是否符合函數中的要求 ;
5 . any 高階函數示例 :
① 代碼示例 :
data class Student(var name : String, var age : Int, var height : Int)var students : List<Student> = listOf<Student>(Student("Tom", 12, 190),Student("Jerry", 18, 165),Student("Trump", 18, 178),Student("Jack", 29, 165) )//...//集合中是否有 18 歲的學生 var is18AgeExist : Boolean = students.any{it.age == 18 } println(is18AgeExist)② 執行結果 :
trueIX . count 高階函數
count 函數原型 : 返回該集合中符合給定謂詞要求的元素個數 ; 傳入一個函數 , 該函數用于判定元素是否符合要求;
/*** Returns the number of elements matching the given [predicate].*/ public inline fun <T> Iterable<T>.count(predicate: (T) -> Boolean): Int {if (this is Collection && isEmpty()) return 0var count = 0for (element in this) if (predicate(element)) checkCountOverflow(++count)return count }2 . count 函數的幾個要素 :
Iterable<T>.count(predicate: (T) -> Boolean): Int① 函數調用者 : count 函數是被 Iterable<T> 對象調用的 , 該對象是一個集合 ;
② 函數的參數 : predicate: (T) -> Boolean 是函數參數 ;
③ 函數返回值 : 返回值是 Boolean 類型 , 該集合中如果存在符合某種條件的元素 , 返回 true , 否則返回 false ;
3 . count 函數類型參數解析 : predicate: (T) -> Boolean , 這是一個函數類型參數 ; predicate有 謂詞 含義;
① predicate: 函數類型變量名 ;
② (T) -> Boolean 是函數參數的類型 : 該函數類型的參數是 T 類型 , T 是集合元素類型 ; 返回值是 Boolean 類型 , 函數的執行內容 : 如果 T 類型參數符合函數中的要求 , 返回 true , 反之返回 false ;
4 . count 高階函數對函數類型參數的使用 : 傳入一個函數類型變量 predicate: (T) -> Boolean , 該函數類型變量通過 predicate(T) 進行調用 , 執行該函數返回 Boolean 值 , 表示該 T 類型對象是否符合函數中的要求 ;
5 . count 高階函數示例 :
① 代碼示例 :
data class Student(var name : String, var age : Int, var height : Int)var students : List<Student> = listOf<Student>(Student("Tom", 12, 190),Student("Jerry", 18, 165),Student("Trump", 18, 178),Student("Jack", 29, 165) )//...//查找年齡小于 19 歲的學生個數 var ageLess19 : Int = students.count {it.age < 19 } println(ageLess19)② 執行結果 :
3X . find 高階函數
find 函數原型 : 返回該集合中符合給定謂詞要求的第一個元素 ;
/*** Returns the first element matching the given [predicate], or `null` if no such element was found.*/ @kotlin.internal.InlineOnly public inline fun <T> Iterable<T>.find(predicate: (T) -> Boolean): T? {return firstOrNull(predicate) }2 . find 函數的幾個要素 :
Iterable<T>.find(predicate: (T) -> Boolean): T?① 函數調用者 : find 函數是被 Iterable<T> 對象調用的 , 該對象是一個集合 ;
② 函數的參數 : predicate: (T) -> Boolean 是函數參數 ;
③ 函數返回值 : 返回值是 T 類型 , 該集合中如果存在符合某種條件的元素 , 返回第一個該元素 , 使用 ? 修飾說明該值不能為空 ;
3 . find 函數類型參數解析 : predicate: (T) -> Boolean , 這是一個函數類型參數 ; predicate有 謂詞 含義;
① predicate: 函數類型變量名 ;
② (T) -> Boolean 是函數參數的類型 : 該函數類型的參數是 T 類型 , T 是集合元素類型 ; 返回值是 Boolean 類型 , 函數的執行內容 : 如果 T 類型參數符合函數中的要求 , 返回 true , 反之返回 false ;
4 . find 高階函數對函數類型參數的使用 : 傳入一個函數類型變量 predicate: (T) -> Boolean , 該函數類型變量通過 predicate(T) 進行調用 , 執行該函數返回 Boolean 值 , 表示該 T 類型對象是否符合函數中的要求 ;
5 . find 高階函數示例 :
① 代碼示例 :
data class Student(var name : String, var age : Int, var height : Int)var students : List<Student> = listOf<Student>(Student("Tom", 12, 190),Student("Jerry", 18, 165),Student("Trump", 18, 178),Student("Jack", 29, 165) )//...//查找第一個年齡 18 歲的學生 var first18Student = students.find {it.age == 18 } println(first18Student)② 執行結果 :
Student(name=Jerry, age=18, height=165)XI . Kotlin 語言集合中的高階函數 代碼示例
1 . 代碼示例 :
package list/*** data class 類能快速幫助開發者封裝 各種類型的數據 ,* 編譯后生成的 JavaBean 只生成最基本的幾個函數 ,* 如 hashCode() , toString() , copy() 等** 定義時需要將 要封裝的字段寫在構造函數中 , 格式如下* var / val 變量名 : 變量類型** 參數要求 : 構造函數必有 >= 1 個參數 , 參數格式必須按照上述格式聲明* 修飾 : data class 不能被 abstract / inner / open / sealed 修飾* 繼承關系 : data class 可以實現接口 , 在 1.1 版本后 , 可以繼承*/ data class Student(var name : String, var age : Int, var height : Int)/*** 聲明 List 集合 , 其中有兩個 Student 對象*/ var students : List<Student> = listOf<Student>(Student("Tom", 12, 190),Student("Jerry", 18, 165),Student("Trump", 18, 178),Student("Jack", 29, 165) )fun main() {//篩選出 students 中 18 歲的學生 , 并打印出來filterByAge(18);/*如果有很多類型的篩選 , 需要些好很多 filterBy 方法 ;如按照身高篩選 , 按照名字篩選 , 按照年齡篩選每種類型都要寫一種方法 , 非常繁瑣開發時間長了 , 很難維護解決上述問題的方案 :行為參數化 : 將篩選操作封裝在函數中 , 將該函數傳遞給過濾器高階函數 : 使用函數類型作為 參數 或 返回值 的函數 , 是高階函數下面的示例就是使用高階函數解決上述問題 :*//*List 高級函數 :maxBy minBy 高階函數 :選出年齡最大的學生Java 語言邏輯 : 首先要遍歷集合獲取最大的年齡 , 然后逐個遍歷查找年齡最大的的學生調用 集合的 maxBy 方法 , 即可獲取值最大的元素 , 并且添加到返回的子集合中*** Returns the first element yielding the largest value of the given function or `null` if there are no elements.** @sample samples.collections.Collections.Aggregates.maxBy*public inline fun <T, R : Comparable<R>> Iterable<T>.maxBy(selector: (T) -> R): T? {val iterator = iterator()if (!iterator.hasNext()) return nullvar maxElem = iterator.next()if (!iterator.hasNext()) return maxElemvar maxValue = selector(maxElem)do {val e = iterator.next()val v = selector(e)if (maxValue < v) {maxElem = emaxValue = v}} while (iterator.hasNext())return maxElem}maxBy 函數需要傳入 selector: (T) -> R 參數 , 這是一個函數類型參數 ,selector 是變量名 ,(T) -> R 是函數類型 :T 是迭代器類型 , Iterable<T> , 代表 Student 學生類型R 是返回值類型maxBy 和 minBy 都是返回 集合中的 最大 或 最小 的第一個元素filter 高階函數 :*** Returns a list containing only elements matching the given [predicate].*public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {return filterTo(ArrayList<T>(), predicate)}filter 是查找特定條件的元素filter 函數接收參數 predicate: (T) -> Booleanpredicate 是函數類型變量名(T) -> Boolean 是函數類型 , 其參數是元素類型對象 , 即 Student 對象 , 返回值是布爾值map 高階函數 :作用 : 將某個屬性映射成新的集合 , 如將學生的 年齡 放到一個新的 Int 集合中 , 名字放到新的 String 集合中map 接收 transform: (T) -> R 參數 :transform 是函數類型變量名(T) -> R 是函數類型 , T 類型是參數類型 , R 類型是返回值類型 ,在 map 函數中 , 創建了一個 R 類型的集合 , 并根據 傳入的 T 類型元素生成 R 類型元素 , 將 R 類型元素放到對應集合中*** Returns a list containing the results of applying the given [transform] function* to each element in the original collection.** @sample samples.collections.Collections.Transformations.map*public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)}any 高階函數傳入 predicate: (T) -> Boolean 參數參數類型是 (T) -> Boolean 函數類型 , 函數類型中的參數是 T 元素類型 , 返回值是 布爾值獲取集合中是否有符合某種條件的元素*** Returns `true` if at least one element matches the given [predicate].** @sample samples.collections.Collections.Aggregates.anyWithPredicate*public inline fun <T> Iterable<T>.any(predicate: (T) -> Boolean): Boolean {if (this is Collection && isEmpty()) return falsefor (element in this) if (predicate(element)) return truereturn false}count 高階函數 : 統計符合條件元素的個數count 方法傳入的函數類型 predicate: (T) -> Booleanpredicate: (T) -> Boolean 函數類型函數類型實例名稱 : predicate參數 : predicate: (T) -> Boolean返回值 : Boolean 布爾值count 方法返回值 : Int 類型 , 返回符合 predicate: (T) -> Boolean 函數類型實例執行返回 true 的元素個數public inline fun <T> Iterable<T>.count(predicate: (T) -> Boolean): Int {if (this is Collection && isEmpty()) return 0var count = 0for (element in this) if (predicate(element)) checkCountOverflow(++count)return count}find 高階函數 : 查找第一個符合條件的元素find 函數參數 : predicate: (T) -> Boolean 函數類型變量find 函數返回值 : T 類型的元素對象 , 返回符合 傳入的函數變量執行返回 true 的元素集合的第一個元素predicate: (T) -> Boolean 函數類型 :public inline fun <T> Iterable<T>.find(predicate: (T) -> Boolean): T? {return firstOrNull(predicate)}groupBy 高階函數 : 將元素分組*/// 獲取年齡最大的學生var maxAgeStudent = students.maxBy { it.age }println(maxAgeStudent)// 獲取身高最低的學生var minHeightStudent = students.minBy { it.height }println(minHeightStudent)// 篩選出年齡大于 15 , 并且身高小于 180 的學生 , 其返回值是一個集合// 后面可以有多個 and 連接多個判斷語句var ageH15HeightLow180 = students.filter {(it.age > 15 ) and (it.height < 180)}println(ageH15HeightLow180)//將 Student 對象中的 姓名 和 年齡抽取出來 , 拼接成 "姓名 : 年齡" 字符串, 放到一個新的 字符串集合中var studentNameAgess = students.map {"${it.name} : ${it.age}"}println(studentNameAgess)//集合中是否有 18 歲的學生var is18AgeExist : Boolean = students.any{it.age == 18}println(is18AgeExist)//查找年齡小于 19 歲的學生個數var ageLess19 : Int = students.count {it.age < 19}println(ageLess19)//查找第一個年齡 18 歲的學生var first18Student = students.find {it.age == 18}println(first18Student)//按照年齡分組 , 結果是 map 集合var groupAgeResult = students.groupBy { it.age }println(groupAgeResult)//按照身高分組 , 結果是 map 集合 , 獲取 165 身高的學生 , 并且遍歷打印出來students.groupBy { it.height }.get(165)?.forEach { println(it) }}/*** 篩選出 students 中 18 歲的學生 , 并打印出來** 這是按照 Java 代碼的邏輯寫的*/ fun filterByAge(age : Int){// 1 . 先創建一個集合var filterStudents : ArrayList<Student> = ArrayList<Student>()// 2 . 遍歷 students 集合 , 并將 18 歲的篩選出來for (student in students){if(student.age == age){filterStudents.add(student);}}// 3 . 打印篩選出的學生for(student in filterStudents){println("${student.name} , ${student.age} , ${student.height}")}}2 . 執行結果 :
Jerry , 18 , 165 Trump , 18 , 178 Student(name=Jack, age=29, height=165) Student(name=Jerry, age=18, height=165) [Student(name=Jerry, age=18, height=165), Student(name=Trump, age=18, height=178), Student(name=Jack, age=29, height=165)] [Tom : 12, Jerry : 18, Trump : 18, Jack : 29] true 3 Student(name=Jerry, age=18, height=165) {12=[Student(name=Tom, age=12, height=190)], 18=[Student(name=Jerry, age=18, height=165), Student(name=Trump, age=18, height=178)], 29=[Student(name=Jack, age=29, height=165)]} Student(name=Jerry, age=18, height=165) Student(name=Jack, age=29, height=165) 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【Kotlin】Kotlin 语言集合中的高阶函数详解 ( 数据类 data class | maxBy | minBy | filter | map | any | count | find )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kotlin】apply 内联扩展函数
- 下一篇: 【Kotlin】Kotlin 领域特定语