Как применить фильтр с FP / scala - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть класс с некоторыми значениями Option, и мне нужно применить все значения, которые в классе обозначены Some, к списку объектов.

Пример:

class Thing(name: String, age: Int)
class Filter(name: Option[String], age: Option[Int], size: Option[Int])
val list: List[Thing] = functionThatReturnsAListOfThings(param)
val filter: Filter = functionThatReturnsAFilter(otherParam)
list.filter{ thing => 
  if filter.name.isDefined {
    thing.name.equals(filter.name.get)
  }
  if filter.age.isDefined {
    thing.age == filter.age.get
  }
}.take{
  if filter.size.isDefined filter.size.get
  else list.size
}

Как правильно применить фильтр к списку с помощью FP?

1 Ответ

0 голосов
/ 20 февраля 2019

Прежде всего нам нужно внести небольшое изменение, чтобы аргументы конструктора были открытыми членами.

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...