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

igx*_*igx 5 design-patterns filtering scala

我有以下列表:

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
Run Code Online (Sandbox Code Playgroud)

我想过滤所有"ids"> 45.我试过类似这篇文章的过滤器使用模式匹配):

someList.filter{ case(myPair) => ids >= 45 }
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*icz 17

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

someList.filter(_.ids >= 45)
Run Code Online (Sandbox Code Playgroud)

或稍微冗长/可读:

someList.filter(pair => pair.ids >= 45)
Run Code Online (Sandbox Code Playgroud)


ped*_*rla 6

你的意思是:

someList.filter{ case MyPair(ids,vals) => ids >= 45 }
Run Code Online (Sandbox Code Playgroud)

更名myPairMyPair,小写开头的标识符被认为是变量,就像idsvals在上面. - 实际上这不是真的,请看@RandallSchulz的评论.

更进一步(1):

val someList = someTable.map(case (ids,vals) => MyPair(ids,vals)).toList
Run Code Online (Sandbox Code Playgroud)

更多(2):

val someList = someTable.map(elem => MyPair.tupled(elem)).toList
Run Code Online (Sandbox Code Playgroud)

方式更多(3):

val someList = someTable.map(MyPair.tupled).toList
Run Code Online (Sandbox Code Playgroud)

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

  • 以小写字母开头的名称只有在没有开括号的情况下才被视为自由模式变量.但是,任何带有字母数字名称的类都应以大写字母开头.另一方面,如果你有一个`RegEx`实例并希望与它匹配(通过`RegEx`的提取器),没有理由以大写字母开头命名. (3认同)

Don*_*zie 5

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

someTable collect {case (i, v) if i > 45 => MyPair(i, v)}
Run Code Online (Sandbox Code Playgroud)

collect将过滤操作和映射操作结合在一起。