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)
你的意思是:
someList.filter{ case MyPair(ids,vals) => ids >= 45 }
Run Code Online (Sandbox Code Playgroud)
更名myPair到MyPair,小写开头的标识符被认为是变量,就像ids和vals在上面. - 实际上这不是真的,请看@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].
这是使用模式匹配的另一个变体
someTable collect {case (i, v) if i > 45 => MyPair(i, v)}
Run Code Online (Sandbox Code Playgroud)
collect将过滤操作和映射操作结合在一起。