模式匹配Scala中的案例类列表

时间:2014-09-05 07:51:19

标签: list scala pattern-matching scala-collections

假设我有一个我希望模式匹配的案例类列表,如果有类型,则返回true或false。例如。,

case class TypeA(one: String, two: Int, three: String)

val list = List(TypeA, TypeA, TypeA)

我现在想要匹配类型列表,看看TypeA是否包含其参数之一的某个值(比如第一个参数)。我所拥有的是以下内容:

def isAvailableInTypeA(list: List[TypeA], checkStr: String) = {
  !(list.dropWhile(_.one != checkStr).isEmpty))
}

对于我想要达到的目标,是否有更好的可读性建议?

4 个答案:

答案 0 :(得分:7)

如果要检查谓词是否适用于列表元素,请使用.exists

scala> val l = List(TypeA("a",2,"b"), TypeA("b",2,"b"))
l: List[TypeA] = List(TypeA(a,2,b), TypeA(b,2,b))

scala> l.exists(_.one == "a")
res0: Boolean = true

scala> l.exists(_.one == "c")
res1: Boolean = false

答案 1 :(得分:2)

这个版本更简洁:

def listContainsValue(list: List[TypeA], checkStr: String): Boolean = {
  list.exists(_.one == checkStr)
}

答案 2 :(得分:1)

为了验证条件并实际获取保持它的第一个值,考虑

val l = List(TypeA("a",1,"aa"), TypeA("b",2,"bb"), TypeA("c",3,"cc"))

使用collectFirst,例如,

l.collectFirst { case tA if tA.one == "b" => tA }
res: Some(TypeA(b,2,bb))

l.collectFirst { case tA if tA.one == "d" => tA }
res: None

其中None选项表示集合中没有元素符合条件。

答案 3 :(得分:1)

您可以定义模式匹配功能,该功能循环显示列表并检查您想要的值,例如。 “比赛!” 如果它存在于列表的任何元素中,则返回true,否则返回false。

def myMatch(in: List[TypeA]): Boolean = in match {
   //found, return true
   case TypeA("MATCH!",_,_) :: rest => true
   // not found, recursive call with remainder of list
   case TypeA(_,_,_) :: rest => myMatch(rest)
   //end of list, return false
   case _ => false
}

否定案例(返回false)

myMatch(List(TypeA("NOMATCH!",3,"a"), TypeA("NOMATCH!",3,"b"), TypeA("NOMATCH!",3,"c")))

正面情况(返回true)

myMatch(List(TypeA("NOMATCH!",3,"a"), TypeA("MATCH!",3,"b"), TypeA("NOMATCH!",3,"c")))