2014-09-05 53 views
4

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

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

val list = List(TypeA, TypeA, TypeA) 

我想现在对阵类型列表,看看类型A包含其参数的一个特定值(比如第一个参数)。我有以下内容:

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

对于我想实现的目标,有没有更好的可读性建议?

回答

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 
2

这个版本是一个比较简洁:

def listContainsValue(list: List[TypeA], checkStr: String): Boolean = { 
    list.exists(_.one == checkStr) 
} 
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选项表示集合中没有元素保持该条件。

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")))