2017-02-09 66 views
0

我有一個下面的斯卡拉特質列表。如何將列表分成兩個,一個只包含ValidatedSbcCommand對象,另一個只包含FailedValidationSbcCommand對象?基於匹配模式的單獨的scala列表

sealed trait SbcCommandorOrValidationError 
case class ValidatedSbcCommand(sbcCommand: SbcCommand) extends SbcC ommandorOrValidationError 
case class FailedValidationSbcCommand(sbcCommandError: SbcCommandError) extends SbcCommandorOr 
+2

,最簡單的方法就是打電話'collect'兩次,一次爲每個類型。除非你正在寫3D着色器或其他東西,否則沒關係。 –

回答

1

使用列表上的partition方法。它需要一個謂詞併產生一個(List, List)第一個列表是真實的情況,第二個是錯誤的。

+0

不保留子類型信息 – richs

+0

您可以將列表轉換爲適當的類型。 – puhlen

+0

你*可以*,但在Scala中投射總是一個壞主意,而且幾乎總是不必要的。 – Vidya

1
val result = originalList.foldRight(Tuple2(List[ValidatedSbcCommand](), List[FailedValidationSbcCommand]())){ (start, rest) => 
     start match { 
      case a:ValidatedSbcCommand => (a::rest._1, rest._2) 
      case b:FailedValidationSbcCommand => (rest._1, b::rest._2) 
      case _ => rest 
     } 
    } 

然後result._1會給你的ValidatedSbcCommand列表,result._2會給你的FailedValidationSbcCommand列表。

1

我更喜歡使用partition模式匹配。鑑於listList[SbcCommandorOrValidationError]型的,並且只包含ValidatedSbcCommand S和FailedValidationSbcCommand S,你可以這樣做:

val (validatedCommands, failedCommands) = list.partition { 
    case command: ValidatedSbcCommand => true 
    case _ => false 
} 

,其中第一清單所有ValidatedSbcCommand S和第二個是所有這將返回(List[SbcCommandorOrValidationError], List[SbcCommandorOrValidationError])類型的元組FailedValidationSbcCommand s。

如果您以後需要訪問特定的子類,請不要投射。使用模式如上匹配:除非你確信你不能做對列表兩遍

validatedCommands.map { 
    case c: ValidatedSbcCommand => functionTakingValidatedSbcCommandsOnly(c) 
}