scala - 使用带模式匹配的过滤器

时间:2013-02-18 17:07:43

标签: scala design-patterns filtering

我有以下列表:

case class myPair(ids:Int,vals:Int)

val someTable = List((20,30), (89,90), (40,65), (45,75), (35,45))

val someList:List[myPair] =
  someTable.map(elem => myPair(elem._1, elem._2)).toList

我想过滤所有“ids”> 45。 我试过像这篇文章filter using pattern matching):

someList.filter{ case(myPair) => ids >= 45 }

但没有成功。 感谢您的帮助

4 个答案:

答案 0 :(得分:17)

根本不需要模式匹配,类型在编译时是已知的:

someList.filter(_.ids >= 45)

或略微更详细/可读:

someList.filter(pair => pair.ids >= 45)

答案 1 :(得分:6)

你的意思是:

someList.filter{ case MyPair(ids,vals) => ids >= 45 }

myPair重命名为MyPair,以小写字母开头的标识符被视为变量,与上面的idsvals非常相似。 - 实际上这不是真的,请看@RandallSchulz的评论。

更进一步(1):

val someList = someTable.map(case (ids,vals) => MyPair(ids,vals)).toList

更多(2):

val someList = someTable.map(elem => MyPair.tupled(elem)).toList

方式更多(3):

val someList = someTable.map(MyPair.tupled).toList

当然,只有(1)是关于模式匹配的。 (2)和(3)将MyPair.apply(Int,Int)的参数转换为元组[Int,Int]。

答案 2 :(得分:3)

这是使用模式匹配的另一个变体

someTable collect {case (i, v) if i > 45 => MyPair(i, v)}

collect结合了过滤操作和地图操作。

答案 3 :(得分:0)

case class myPair(ids:Int,vals:Int)

val someTable = List((20,30), (89,90), (40,65), (45,75), (35,45))

val someList:List[myPair] = for( elem <- someTable; if elem._1 > 45) yield myPair(elem._1, elem._2)

哪个给出了

someList: List[myPair] = List(myPair(89,90))