我有一个具有一些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
}
附带的所有值应用于对象列表。
示例:
{{1}}
如何使用FP将过滤器正确应用于列表?
答案 0 :(得分:1)
首先,我们需要进行一些更改,以使构造函数参数成为公共成员。
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)
更有效率。