Прежде всего нам нужно внести небольшое изменение, чтобы аргументы конструктора были открытыми членами.
class Thing(val name: String, val age: Int)
class Filter(val name : Option[String]
,val age : Option[Int]
,val size : Option[Int])
Далее, из вашего примера кода не ясно, что должно произойти, когда filter.name
и filter.age
равны None
.Я предполагаю, что None
означает true
, то есть не отфильтровано.
list.filter { thing =>
filter.name.fold(true)(_ == thing.name) &&
filter.age.fold(true)(_ == thing.age)
}.take(filter.size.getOrElse(Int.MaxValue))
Обратите внимание, что take(Int.MaxValue)
немного более эффективен, чем take(list.size)
.