Kotlin Lambda表達式實踐使用介紹
集合的創(chuàng)建和遍歷方式
- 集合只要包含List和Set在寬泛一些就包括Map這種鍵值對類型的數(shù)據(jù)結構
- List,Set和Map在java當中都是接口,其中List的主要實現(xiàn)類是ArrayList和LinkedList,Set的主要用的實現(xiàn)類是HashSet,Map主要用的實現(xiàn)類是HashMap
- 現(xiàn)在我們要創(chuàng)建一個水果集合來放水果,在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一樣,只是將創(chuàng)建集合地方式換成了setOf和mutableSetOf
val set = setOf<String>("香蕉", "橘子", "蘋果")
set集合存放的元素是不可重復的
Map集合的用法在Kotlin當中也比較多,和java比較類似的是下面這一種
val map = HashMap<String, Int>() map.put("香蕉", 1) map.put("西瓜", 2)
但是在Kotlin當中還有一種類似于數(shù)組下標的寫法
val map = HashMap<String, Int>() map["香蕉"] = 1 map["西瓜"] = 2
而在map中讀取一條寫法
map.get("香蕉") //或者還可以是這樣(推薦) map["香蕉"]
當然上面這些都不是最簡單的寫法,在Kotlin當中給Map也提供了mapOf和mutableMapOf兩個函數(shù)進行快速的初始化
fun main() { val map = mapOf<String, Int>("香蕉" to 1, "西瓜" to 2) for ((fruit, number) in map) { println("fruit is " + fruit + "number is " + number) } }
集合的函數(shù)式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)
寫法二:(使用函數(shù)式API寫法)
val list = listOf<String>("Apple", "Banana", "Orange", "Pear") val maxLengthFruit = list.maxBy { it.length } println("max length fruit is " + maxLengthFruit)
- 上面的代碼不易理解,下面一步步分析Lambda表達式的寫法
- Lambda定義:就是一小段可以作為參數(shù)傳遞的代碼
- Lambda表達式的語法結構體
{參數(shù)名1: 參數(shù)類型, 參數(shù)名2: 參數(shù)類型 -> 函數(shù)體}
- 回到剛才找出最長單詞的水果的需求,其中maxBy就是一個普通的函數(shù)而已,只不過就是接收了一個Lambda類型的參數(shù),并且在遍歷的時候將每次遍歷的值傳遞給Lambda表達式,maxBy函數(shù)就是根據(jù)我們傳入的條件來遍歷集合,從而找到該條件下的最大值
- 理解原理之后這個代碼就可以這樣寫了
val list = listOf<String>("Apple", "Banana", "Orange", "Pear") //定義一個lambda表達式 val lambda = {fruit: String -> fruit.length} //然后將這個lambda表達式作為參數(shù)傳遞給maxBy函數(shù),maxBy函數(shù)的作用就是遍歷集合,根據(jù)參數(shù)條件來找到最大值 val maxLengthFruit = list.maxBy(lambda)
- 但是上述寫法比較啰嗦麻煩,可以在此基礎上進行簡化操作
- 首先不需要專門定義一個Lambda變量,而是可以直接將Lambda表達式傳入maxBy函數(shù)中
val maxLengthFruit = list.maxBy({<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length})
- 然后在Kotlin當中規(guī)定當Lambda表達式是函數(shù)最后一個參數(shù)的時候,可以將Lambda表達式一道函數(shù)括號外面
val maxLengthFruit = list.maxBy(){<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length}
- 如果當lambda參數(shù)是函數(shù)唯一一個參數(shù)的時候,函數(shù)的括號可以省略
val maxLengthFruit = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length}
- 然后在Kotlin當中擁有優(yōu)秀的推到機制,Lambda表達式中的參數(shù)列表在大多數(shù)的情況下沒必要聲明參數(shù)的類型,因此可以進一步簡化成為
val maxLengthFruit = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit -> fruit.length}
- 最后在Lambda中當參數(shù)列表只有一個參數(shù)的時候,也不必要聲明參數(shù)名,而是直接使用it關鍵字代替即可,那么代碼就變成了
val maxLenght = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->it.length}
- 集合當中的map函數(shù)是比較常用的一種函數(shù)式API,它將用于集合中每個元素都映射成為一個另外的值,映射的規(guī)則在Lambda表達式中進行指定
- 將單詞都轉換成為大寫字母
val list = listOf<String>("Apple", "Banana") val newList = list.map { it.toUpperCase() } for (fruit in newList) { println(fruit) }
- map函數(shù)的功能十分的強大,可以按照我們的需求對集合中的元素進行任意的映射轉換
- filter函數(shù):是用來過濾集合當中數(shù)據(jù)的,可以單獨使用,也可以和map函數(shù)配合在一起進行使用
- 比如我們想保留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函數(shù)和all函數(shù)
- any函數(shù)用于判斷集合中是否至少存在一個元素滿足指定條件,all函數(shù)用于判斷集合中是否所有元素都滿足指定的條件
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內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Android系統(tǒng)中跨應用數(shù)據(jù)分享功能的實現(xiàn)
這篇文章主要介紹了Android系統(tǒng)中跨應用數(shù)據(jù)分享功能的實現(xiàn),文中分為發(fā)送文字、二進制內容和圖片三種情況來講,需要的朋友可以參考下2016-04-04Android 倒計時控件 CountDownView的實例代碼詳解
這篇文章主要介紹了Android 倒計時控件 CountDownView的實例代碼,代碼簡單易懂,非常不錯,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06Android RecyclerView多類型布局卡片解決方案
這篇文章主要介紹了Android RecyclerView多類型布局卡片解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03Android開發(fā)之拼音轉換工具類PinyinUtils示例
這篇文章主要介紹了Android開發(fā)之拼音轉換工具類PinyinUtils,涉及Android基于pinyin4j-2.5.0.jar包文件實現(xiàn)漢字轉拼音功能的相關操作技巧,需要的朋友可以參考下2017-11-11Android ListView自定義Adapter實現(xiàn)仿QQ界面
這篇文章主要為大家詳細介紹了ListView自定義Adapter實現(xiàn)仿QQ界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10