Я пытаюсь реализовать класс Filter, который может состоять из других классов Filter. Цель состоит в том, чтобы каждый фильтр мог обрабатывать объект и возвращать логическое значение, и, если он состоит из нескольких фильтров, он вычисляет AND всех своих фильтры.
Я пытаюсь заставить одного из конструкторов получить предикаты vararg , которые необходимо преобразовать в vararg фильтров. Компилятор говорит, что ни одна из функций (первичных и первых вторичных конструкторов) не может быть вызвана с этими параметрами.
Насколько я понимаю, * следует преобразовать List<Filter<T>>
в vararg Filter<T>
, но это не работает.
class Filter<in T>(private vararg val filters: Filter<T>) {
constructor(predicate: (T) -> Boolean) : this(Filter(predicate))
constructor(vararg predicates: (T) -> Boolean) : this(Filter<T>(*(predicates.map { predicate -> Filter<T>(predicate) })))
fun process(input: T): Boolean {
for (filter in filters) { if (!filter.process(input)) return false }
return true
}
}
Что я могу сделать, чтобы достичь этого?
Кроме того, это большие издержки итерации по фильтрам только одного предиката по сравнению с простой проверкой предиката (учитывая, что это будет вызываться много раз для фильтрации списка)?