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!

推薦閱讀: