2014-09-05 82 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")))