根据可选参数值过滤列表

z12*_*345 7 scala

是否有更优雅的方法根据可选参数值过滤列表?

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个案例等.

Sha*_*nds 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)


Kig*_*gyo 5

在任意数量的过滤器的情况下:

您可以先将参数更改为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)