kotlin之plus、copyOf、reverse、forEach、filter、map、reduce、fold等函式解釋和使用

釣魚的小木匠發表於2019-03-02

kotlin之::函式呼叫、plus(增加元素)、copyOf(複製陣列)、reverse(翻轉陣列)、forEach(遍歷陣列)、filter(過濾陣列)、map函式操作及擴充套件、reduce函式、fold函式、filter、filterIndexed、takeWhile、infix關鍵字等的解釋和使用示例。

說明已經在程式碼裡面了,請看程式碼。如果有任何疑問或者建議,可以留言。謝謝。

函式的其它用法::,操作函式的其它方式。

class ComposeCall {
    fun sayHi() {
        System.out.println("ComposeCall,sayHi:Hi!")
    }

    fun sayHiToAny(any: Any) {
        System.out.println("--->ComposeCall,sayHiToAny:Hi," + any)
    }
}
複製程式碼

驗證

    var hi1 = ComposeCall::sayHiToAny//返回的是方法本身,而不是返回值
    println("hil:" + hi1)
    //輸出
//    hil:fun com.tanksu.ndkdemo3.feature.cls.ComposeCall.sayHiToAny(kotlin.Any): kotlin.Unit

    var hi2 = ComposeCall::sayHi
    var com = ComposeCall()
    hi2(com)//必須要傳入類的例項才能夠進行呼叫,相當於java的invoke一樣
    hi1(com, "jack")//傳入類例項和引數,相當於java的invoke方法,去呼叫hi2,以及入參
    //輸出
//        ComposeCall,sayHi:Hi!
//        --->ComposeCall,sayHiToAny:Hi,jack
複製程式碼

陣列操作之plus(增加元素)、copyOf(複製陣列)、reverse(翻轉陣列)、forEach(遍歷陣列)、filter(過濾陣列)等方法對陣列的操作。

        val arr = arrayOf("Apple", "Banana", "", "Orange")
        arr.forEach(::println)//空物件也輸出了
        println("--------------------------")
        var narr = arr.plus("juice")//這裡必須用另外一個物件來接收,原來的物件不會改變
        var newArr = narr.copyOf()//複製一份新的arr
        newArr.forEach(::println)
        println("--------------------------")
        arr.reverse()//將陣列翻轉過來
        arr.forEach(::println)
        println("--------------------------")
        println(arr.filter(String::isNotEmpty))//filter將會過濾不為空的物件
//        Apple
//        Banana
//
//        Orange
//        --------------------------
//        Apple
//        Banana
//
//        Orange
//        juice
//        --------------------------
//        Orange
//
//        Banana
//        Apple
//        --------------------------
//        [Orange, Banana, Apple]
複製程式碼

list的map函式操作及擴充套件,對陣列進行自定義操作。

    val raw = listOf(1, 2, 3, 4, 5, 5)
    val newList = ArrayList<Int>()
    raw.forEach {
        newList.add(it + 1)//it替代raw中每一個元素,這裡一次加入到newList中
    }
    println(newList)
    println(raw.map { it * 10 })//map先遍歷raw的元素,然後再執行列印動作
    println(raw.map(Int::toDouble))//map先將每個元素都變成double型別,然後再執行列印動作
//        [2, 3, 4, 5, 6, 6]
//        [10, 20, 30, 40, 50, 50]
//        [1.0, 2.0, 3.0, 4.0, 5.0, 5.0]
複製程式碼

陣列的reduce函式:遍歷陣列元素,並自定義操作。和fold類似。

        val list = listOf(2, 3, 5)
        println(list.reduce { ret, i -> ret + i })//第一個引數ret是結果,第二個引數是代表要執行的操作,
        // 比如我這裡是陣列每個元素相乘,最後吧結果輸出給ret。。。。下面我將進行加法操作,如下
        //輸出:30
        //加法操作
        println(list.reduce { ret, i -> ret + i })
        //輸出:10
複製程式碼

陣列的fold函式用法:對陣列進行進行自定義操作。和reduce類似。

    val list = listOf(2, 3, 5)
    println("--------------------------")
    println(raw.fold(10) { ret, i -> ret + i })//這裡給了一個初始值10,然後fold操作和reduce操作類似
    println(raw.fold(StringBuilder("jack say:")) { ret, i -> ret.append(i) })//這裡也給了一個初始值StringBuilder
    // ,在第二個引數裡面才能夠進行append操作
    //輸出結果
//        --------------------------
//        20
//        jack say:235
複製程式碼

陣列方法之filter、filterIndexed、takeWhile等對陣列元素操作。

        val list = listOf(4, 3, 2, 5, 6, 8, 9)
        println(list.filter { it == 3 || it == 6 })//過濾等於3或者等於6的元素集合,結果以新的集合返回
        println(list.filterIndexed { index, i -> index == i })//過濾等於第一個引數的元素集合,結果以新的集合返回
        println(list.takeWhile { it in 0..5 })//過濾在0-5之間的元素,結果以新的集合返回
        println(list.takeWhile { it in 3..5 })//過濾在3-5之間的元素,結果以新的集合返回。這裡加入判斷到其中一個元素不滿足條件,就會終止執行下面的元素判斷
        //輸出結果
//        [3, 6]
//        [2]
//        [4, 3, 2, 5]
//        [4, 3]
複製程式碼

infix的關鍵字解釋:函式的另外一種呼叫手法。(騷操作)

        class TestInfix(var age: Int) {
            infix fun dog(weight: Int) {
                println("TestInfix, dog $age and $weight")
            }

            infix fun cat(weight: String) {
                println("TestInfix, dog $age and $weight")
            }
        }

        infix fun TestInfix.rat(mounth: Int) {//這是
            println("TestInfix rat $age and $mounth")
        }

        var i = TestInfix(3)
        i dog 80
        i rat 1
        i cat "jack"
//        TestInfix, dog 3 and 80
//        TestInfix rat 3 and 1
//        TestInfix, dog 3 and jack
複製程式碼

非空判斷:

用 ? 呼叫是安全呼叫,在被呼叫的量為空時也返回null
用 !! 呼叫的是假定非空呼叫,在被呼叫的量為空時會發起空指標異常(NPE)
或者直接用條件判斷(if-else)來事先決定好空量的處理方案
複製程式碼

相關文章