Kotlin基礎(7)-->集合與函數式API

一、創建與遍歷集合

1.List與Set集合

(1).不可變集合:無法進行增刪改查操作
val list = listOf("王大錘", "愣子", "歐陽瘋子")
(2).可變集合:可以進行增刪改查操作
 val list = mutableListOf("王大錘", "愣子", "歐陽瘋子")
        list.add("李大麻子")
        for (i in list) {
            println(i)
        }
       //輸出日誌:王大錘 愣子 歐陽瘋子 李大麻子

Set用法與List一模一樣,只是替換成了setOf()mutableSetOf(),另外List是有序的,Set是無序的。

2.Map集合

(1).數組下標語法結構的寫法
    val map = HashMap<String, Int>()
    map["王大錘"] = 1
    map["李大麻子"] = 2
    map["愣鬼"] = 3

取數據

val number = map["愣鬼"]
(2).mapOf、mutableMapOf的寫法
val map = mapOf("王大錘" to 1, "李大麻子" to 2, "愣鬼" to 3)
    for ((key, value) in map) {
        println(key + value)
        //輸出日誌:王大錘1 李大麻子2 愣鬼3
    }

二、集合的函數式API

1.Lambda表達式

Lambda的定義:Lambda就是一小段可以作爲參數傳遞的代碼。
Lambda語法結構:{參數名1 : 參數類型 , 參數名2 : 參數類型 -> 函數體},首先最外層是一對大括號,如果有參數傳入的話,需要聲明參數列表,參數列表的結尾使用一個 -> 符號,表示參數列表的結束與函數體的開始,函數體中可以編寫任意行代碼,並且最後一段代碼會自動作爲Lambda的返回值。

(1)maxBy()函數

工作原理:它接受的是一個Lambda類型的參數,根據我們傳入的條件來遍歷集合,從而找到條件下的最大值。
eg:找出集合中單詞最長的名字:

 val list = listOf("王大錘", "愣子", "歐陽瘋子")
    var maxLenthName = ""
    for (i in list) {
        if (i.length > maxLenthName.length) {
            maxLenthName = i
        }
    }

使用集合式API簡化後

val list = listOf("王大錘", "愣子", "歐陽瘋子")
    //簡化一
    val lambda = { name: String -> name.length }
    list.maxBy(lambda)
    //簡化二
    list.maxBy({ name: String -> name.length })
    //簡化三
    list.maxBy() { name: String -> name.length }
    //簡化四
    list.maxBy { name: String -> name.length }
    //簡化五
    list.maxBy { name -> name.length }
    //簡化六
    list.maxBy { it.length }

原理:
1.當Lambda參數是函數最後一個參數時,可以將Lambda表達式移到函數括號外面 (二到三)。
2.當Lambda參數勢函數唯一一個參數時,可以將函數的括號省略(三到四)。
3.由於Kotlin擁有出色的類型推導機制,Lambda表達式中的參數列表大多數情況下不必聲明參數類型(四到五)。
4.當Lambda表達式中的參數列表只有一個參數時,不必聲明參數名,可以使用it關鍵字來代替(五到六)。

接下來我們再學習幾個常見的函數式API

(2)map()函數

工作原理:用於將集合中每個元素都映射成一個另外的值,映射規則在Lambda表達式中指定,最終生成一個新的集合。eg:

fun main() {
    val list = listOf("apple", "banana", "pear")
    val newList = list.map { it.toUpperCase() }
    for (i in newList) {
        print(i)
        //輸出日誌:APPLE BANANA PEAR
    }
}
(3)filter()函數

工作原理:用來過濾集合中的數據,過濾規則在Lambda表達式中指定,,最終生成一個新的集合,可結合map()函數使用。eg:

un main() {
    val list = listOf("apple", "banana", "pear")
    val newList = list.filter { it.length > 4 }.map { it.toUpperCase() }
    for (i in newList) {
        print(i)
        //輸出日誌:APPLE BANANA
    }
}
(4)any()函數與all()函數

any():用於判斷集合中是否至少存在一個元素滿足指定條件。
all():用於判斷集合中是否全部函數都滿足指定條件。
eg:

fun main() {
    val list = listOf("apple", "banana", "pear")
    val anyResult = list.any() { it.length == 4 }
    val allResult = list.all() { it.length == 4 }
    println("anyResult is " + anyResult + " ,allResult is" + allResult)
    //輸出日誌:anyResult is true ,allResult isfalse
}

三、Java的函數式API

含義:我們在Kotlin中調用一個Java方法,並且該方法接收一個Java單抽象方法接口參數,就可以使用函數式API。Java單抽象方法接口指的是接口中只有一個待實現的方法,如果接口中有多個待實現的方法,則無法使用函數式API。
舉個栗子:Java中最常見的單抽象方法接口--Runnable接口:

new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread is running");
            }
        }).start();

使用Kotlin版本:

Thread(object : Runnable {
        override fun run() {
            print("Thread is running")
        }
    }).start()

使用函數式API簡化:

 //簡化一
    Thread(Runnable {
        print("Thread is running")
    }).start()
    //簡化二
    Thread {
        print("Thread is running")
    }.start()

原理:因爲只有一個待實現方法,我們就算不寫,Kotlin也會明白。另外,如果一個Java參數列表中不存在一個以上Java單抽象方法接口參數,我們還可以將接口名進行省略。

Android中常用的點擊事件接口OnclickListener就是一個單抽象方法接口,就可以使用函數式API

tv.setOnClickListener{
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章