Kotlin Lambda表達式實踐使用介紹
集合的創建和遍歷方式
- 集合隻要包含List和Set在寬泛一些就包括Map這種鍵值對類型的數據結構
- List,Set和Map在java當中都是接口,其中List的主要實現類是ArrayList和LinkedList,Set的主要用的實現類是HashSet,Map主要用的實現類是HashMap
- 現在我們要創建一個水果集合來放水果,在Kotlin當中可以這樣寫
val list = ArrayList<String>() list.add("蘋果") list.add("香蕉") list.add("橘子")
這種初始化集合的方式比較繁瑣,在Kotlin當中給我們提供瞭一個listOf方法可以簡化集合的初始化
val list = listOf<String>("蘋果", "香蕉", "橘子")
使用Kotlin當中的for-in方法對集合進行遍歷
fun main() { val list = listOf<String>("蘋果", "香蕉", "橘子") for (fruit in list) { println(fruit) } }
需要註意的是使用listOf方法初始化的集合是一種不可變的集合,意思就是使用listOf初始化的集合隻能用來讀取不能用來添加,修改或者刪除
那麼我們要是想要快速初始化一個集合,又想要可變可以使用mutableListOf方法進行初始化
fun main() { val list = mutableListOf<String>("蘋果", "香蕉", "橘子") list.add("哈密瓜") for (fruit in list) { println(fruit) } }
Set集合地用戶幾乎和List一樣,隻是將創建集合地方式換成瞭setOf和mutableSetOf
val set = setOf<String>("香蕉", "橘子", "蘋果")
set集合存放的元素是不可重復的
Map集合的用法在Kotlin當中也比較多,和java比較類似的是下面這一種
val map = HashMap<String, Int>() map.put("香蕉", 1) map.put("西瓜", 2)
但是在Kotlin當中還有一種類似於數組下標的寫法
val map = HashMap<String, Int>() map["香蕉"] = 1 map["西瓜"] = 2
而在map中讀取一條寫法
map.get("香蕉") //或者還可以是這樣(推薦) map["香蕉"]
當然上面這些都不是最簡單的寫法,在Kotlin當中給Map也提供瞭mapOf和mutableMapOf兩個函數進行快速的初始化
fun main() { val map = mapOf<String, Int>("香蕉" to 1, "西瓜" to 2) for ((fruit, number) in map) { println("fruit is " + fruit + "number is " + number) } }
集合的函數式API
在一個水果集合當中,找到單詞最長那個水果
寫法一:
val list = listOf<String>("Apple", "Banana", "Orange", "Pear") var maxLengthFruit = "" for (fruit in list) { if (fruit.length > maxLengthFruit.length) { maxLengthFruit = fruit } } println("max length fruit is " + maxLengthFruit)
寫法二:(使用函數式API寫法)
val list = listOf<String>("Apple", "Banana", "Orange", "Pear") val maxLengthFruit = list.maxBy { it.length } println("max length fruit is " + maxLengthFruit)
- 上面的代碼不易理解,下面一步步分析Lambda表達式的寫法
- Lambda定義:就是一小段可以作為參數傳遞的代碼
- Lambda表達式的語法結構體
{參數名1: 參數類型, 參數名2: 參數類型 -> 函數體}
- 回到剛才找出最長單詞的水果的需求,其中maxBy就是一個普通的函數而已,隻不過就是接收瞭一個Lambda類型的參數,並且在遍歷的時候將每次遍歷的值傳遞給Lambda表達式,maxBy函數就是根據我們傳入的條件來遍歷集合,從而找到該條件下的最大值
- 理解原理之後這個代碼就可以這樣寫瞭
val list = listOf<String>("Apple", "Banana", "Orange", "Pear") //定義一個lambda表達式 val lambda = {fruit: String -> fruit.length} //然後將這個lambda表達式作為參數傳遞給maxBy函數,maxBy函數的作用就是遍歷集合,根據參數條件來找到最大值 val maxLengthFruit = list.maxBy(lambda)
- 但是上述寫法比較囉嗦麻煩,可以在此基礎上進行簡化操作
- 首先不需要專門定義一個Lambda變量,而是可以直接將Lambda表達式傳入maxBy函數中
val maxLengthFruit = list.maxBy({<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length})
- 然後在Kotlin當中規定當Lambda表達式是函數最後一個參數的時候,可以將Lambda表達式一道函數括號外面
val maxLengthFruit = list.maxBy(){<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length}
- 如果當lambda參數是函數唯一一個參數的時候,函數的括號可以省略
val maxLengthFruit = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length}
- 然後在Kotlin當中擁有優秀的推到機制,Lambda表達式中的參數列表在大多數的情況下沒必要聲明參數的類型,因此可以進一步簡化成為
val maxLengthFruit = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit -> fruit.length}
- 最後在Lambda中當參數列表隻有一個參數的時候,也不必要聲明參數名,而是直接使用it關鍵字代替即可,那麼代碼就變成瞭
val maxLenght = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->it.length}
- 集合當中的map函數是比較常用的一種函數式API,它將用於集合中每個元素都映射成為一個另外的值,映射的規則在Lambda表達式中進行指定
- 將單詞都轉換成為大寫字母
val list = listOf<String>("Apple", "Banana") val newList = list.map { it.toUpperCase() } for (fruit in newList) { println(fruit) }
- map函數的功能十分的強大,可以按照我們的需求對集合中的元素進行任意的映射轉換
- filter函數:是用來過濾集合當中數據的,可以單獨使用,也可以和map函數配合在一起進行使用
- 比如我們想保留5個字母以內的水果,並且將字母全部轉換成為大寫字母
val list = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape") val newList = list.filter { it.length <= 5 } .map { it.toUpperCase() } for (fruit in newList) { println(fruit) }
- any函數和all函數
- any函數用於判斷集合中是否至少存在一個元素滿足指定條件,all函數用於判斷集合中是否所有元素都滿足指定的條件
val list = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape") val anyResult = list.any {it.length <= 5} val allResult = list.all { it.length <= 5 } println("anyResult is" + anyResult + ", allResult is" + allResult)
到此這篇關於Kotlin Lambda表達式實踐使用介紹的文章就介紹到這瞭,更多相關Kotlin Lambda內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Kotlin 標準函數和靜態方法示例詳解
- pandas中提取DataFrame某些列的一些方法
- Python中集合的創建及常用函數的使用詳解
- Java訪問者設計模式詳細講解
- 一篇文章弄懂Java和Kotlin的泛型難點