假设我有一个我希望模式匹配的案例类列表,如果有类型,则返回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))
}
对于我想要达到的目标,是否有更好的可读性建议?
答案 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")))