如何使用fp/scala应用过滤器

t5fffqht  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(381)

我有一个班级 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将筛选器正确应用于列表?

t0ybt7op

t0ybt7op1#

首先,我们需要做一个小的更改,以便构造函数参数是公共成员。

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

相关问题