[英]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.