是否有更优雅的方法根据可选参数值过滤列表?
def f(dates: List[Date], start: Option[Long], end: Option[Long]): List[Date] = {
(start, end) match {
case (Some(s), Some(e)) => dates filter (_.getTime > s) filter (_.getTime < e)
case (Some(s), None) => dates filter (_.getTime > s)
case (None, Some(e)) => dates filter (_.getTime < e)
case (None, None) => dates
}
}
Run Code Online (Sandbox Code Playgroud)
有三个可选参数值,这将有9个案例等.
一种方法如下:
def f(dates: List[Date], start: Option[Long], end: Option[Long]): List[Date] =
dates.filter( d => start.map(d.getTime > _).getOrElse(true) )
.filter( d => end.map(d.getTime < _).getOrElse(true) )
Run Code Online (Sandbox Code Playgroud)
或者,更简洁,您可以使用forall
选项:
def f(dates: List[Date], start: Option[Long], end: Option[Long]): List[Date] =
dates.filter( d => start.forall(d.getTime > _) )
.filter( d => end.forall(d.getTime < _) )
Run Code Online (Sandbox Code Playgroud)
在任意数量的过滤器的情况下:
您可以先将参数更改为List [Option [Date => Boolean]].然后组合实际存在的所有过滤器.然后应用组合过滤器.
def f(dates : List[Date], filters : List[Option[Date => Boolean]]) = {
val combFilter = filters.foldLeft((d : Date) => true)((comb, filter) => if(filter.isDefined) (d : Date) => comb(d) && filter.get(d) else comb)
dates.filter(combFilter)
}
Run Code Online (Sandbox Code Playgroud)
假设您有日期,开始和结束,您可以将其称为:
f(dates, List(start.map(s => _.getTime > s), end.map(e => _.getTime < e))
Run Code Online (Sandbox Code Playgroud)