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

时间:2019-02-20 20:28:45

标签: scala functional-programming

我有一个具有一些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将过滤器正确应用于列表?

1 个答案:

答案 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.namefilter.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)更有效率。