[英]Combining Function Type in Kotlin with 'or'
我對 Kotlin 很陌生,想知道您是否可以將function 類型的列表合並到一個 function 中。
我有一個界面呈現一個過濾器,以及一些預定義的過濾器:
interface Filter : (Int) -> Boolean {
val a: Int
}
class FilterA(override val a: Int) : Filter {
override fun invoke(numberToFilter: Int): Boolean {
....
}
}
class FilterB(override val a: Int) : Filter {
override fun invoke(numberToFilter: Int): Boolean {
....
}
}
我現在有一個Filter
object 列表,我想使用包含性析取OR
組合它,這樣我就可以將它傳遞給過濾器列表。 例如:
val combinedFilter = listOf(FilterA(a), FilterB(b)). { `do something here` }
val filteredInt = listToBeFiltered.filter { combinedFilter }
但是,我不知何故陷入了定義在do something here
部分。 我相信你可以使用reduce方法來做到這一點,但它總是以某種方式告訴我錯誤。 以下是我嘗試過的方法
val combinedFilter = listOfFilters.reduce { filterA, filterB -> { filterA or filterB } }
infix fun <T> ((T) -> Boolean).or(that: (T) -> Boolean): (T) -> Boolean = { this(it) || that(it) }
但是得到了
Type mismatch.
Required:
Filter
Found:
() → (Int) → Boolean
我相信我的語法有問題。 希望大家可以幫忙。 謝謝。
那是因為您將表達式包裝在額外的 lambda 中, reduce
中的累加器類型也將是您的listOfFilters
的Filter
,但or
返回(T) -> Boolean
。 您可以通過指定累加器的類型並去掉額外的 lambda 來解決此問題:
val combinedFilter = listOfFilters.reduce<(Int) -> Boolean, Filter> { filterA, filterB -> filterA or filterB }
但是有一種更好的方法可以在不分配大量 lambda 的情況下做到這一點:
val combinedFilter = { x: Int -> listOfFilters.any { filter -> filter(x) } }
val filteredInt = listToBeFiltered.filter(combinedFilter)
或者
fun <T> List<(T) -> Boolean>.combineAny() = { x: T -> this.any { filter -> filter(x) } }
val combinedFilter = listOfFilters.combineAny()
val filteredInt = listToBeFiltered.filter(combinedFilter)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.