簡體   English   中英

如何對 kotlin 中的 lambda 表達式應用條件?

[英]How can I apply a condition on a lambda expression in kotlin?

我想在一對列表上應用一個使用高階中綴擴展 function 的條件。 我希望我的條件顯示該對的第一個數字。 具體來說,顯示那些與第二個數字之和為 5 的第一個數字。

這是我到目前為止編寫的代碼

fun main() {
    
    infix fun List<Pair<Int,Int>>.takeFirstsBy(

        condition: // i need help in this line to apply a condition on list of pair
    ):List<Int>{
              
    }
      
}

我不知道如何在 (condition) 語句之后編寫條件語句以應用於對,請幫助我。 謝謝

沒有理由使用更高階的 function 中綴,因為尾隨 lambda syntax 它所做的只是允許您用空格替換點,並使代碼更難閱讀,因為它與傳統語法不同。 此外,collections 上的高階函數通常逐行鏈接,您只能使用點符號來實現。

讓它inline是有意義的,所以每次調用這個 function 時不必分配 lambda。

您可以將接收器類型設為 Iterable 以使 function 更加通用。

您的條件有一個整數對的輸入,需要返回一個 Boolean,所以簽名是(Pair<Int, Int>) -> Boolean

您的 function 的邏輯是僅過濾到通過條件的那些,然后過濾到過濾結果 map 以僅顯示該對的第一個數字。

inline fun Iterable<Pair<Int,Int>>.takeFirstsBy(
    condition: (Pair<Int,Int>)->Boolean
):List<Int>{
    return filter(condition).map { it.first }
}

fun main() {
    val input = listOf(1 to 4, 2 to 3, 5 to 5)
    val result = input.takeFirstsBy { it.first + it.second == 5 }
    println(result)
}

替代實施。 我認為這不太可讀,但效率更高:

inline fun Iterable<Pair<Int,Int>>.takeFirstsBy(
    condition: (Pair<Int,Int>)->Boolean
):List<Int>{
    return mapNotNull { it.takeIf(condition)?.first }
}

您不編寫condition ,但調用程序編寫。

condition: (Pair<Int, Int>) -> Boolean

我們需要一個參數Pair<Int, Int>因為它是列表的項目,所以你可以在你使用的迭代器上調用它。

infix fun List<Pair<Int,Int>>.takeFirstsBy(
    condition: (Pair<Int, Int>) -> Boolean
):List<Int>{
    return this.mapNotNull { 
        if (condition.invoke(it)) {
            //pair.first or pair.second ?
        } else null //null won't be included
    }
}

然后你這樣稱呼它

所以迭代器遍歷列表並根據條件過濾事物

list.takeFirstBy { pair: Pair<Int, Int> ->
    //implement the condition here, returning true/false
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM