у меня есть код, такой как:Scala, фильтр коллекции на основе нескольких условий
val strs = List("hello", "andorra", "trab", "world")
def f1(s: String) = !s.startsWith("a")
def f2(s: String) = !s.endsWith("b")
val result = strs.filter(f1).filter(f2)
сейчас, f1 и f2 должны применяться на основе условия, такие как:
val tmp1 = if (cond1) strs.filter(f1) else strs
val out = if (cond2) tmp1.filter(f2) else tmp1
является там более хороший способ сделать это, не используя временную переменную tmp1
?
один способ будет фильтровать на основе списка функций, таких как:
val fs = List(f1 _,f2 _)
fs.foldLeft(strs)((fn, list) => list.filter(fn))
, но тогда я должен был бы создать список функций на основе условий (и так, я бы переместить эту проблему использования переменной временного списка строк, использовать переменную списка временных функций (или мне нужно будет использовать изменяемый список)).
Я ищу что-то вроде этого (конечно, это не компилируется, иначе я бы уже есть ответ на вопрос):
val result =
strs
.if(cond1, filter(f1))
.if(cond2, filter(f2))
Похоже, вы хотите получить список кортежей с (условие, filterPredicate). Затем вы можете отфильтровать этот список в зависимости от того, выполняется ли условие (например, _._ 1). Теперь у вас есть список функций, которые вы хотите применить. Затем вы можете сопоставить это со строкой и уменьшить с помощью && (логика и). Извините, если он слишком волнительный. – Felix
спасибо, это тоже хорошая идея, но я искал что-то большее, чем ответ на ной. –