簡體   English   中英

將 Kotlin 中的 Function 類型與“或”組合

[英]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中的累加器類型也將是您的listOfFiltersFilter ,但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.

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