我有一个以下scala特征的列表。如何将列表分成两部分,一个只包含ValidatedSbcCommand对象,另一个只包含FailedValidationSbcCommand对象?
sealed trait SbcCommandorOrValidationError 
case class ValidatedSbcCommand(sbcCommand: SbcCommand) extends SbcC  ommandorOrValidationError
case class FailedValidationSbcCommand(sbcCommandError: SbcCommandError) extends SbcCommandorOr发布于 2017-02-10 00:23:51
在list上使用partition方法。它接受一个谓词并生成一个(List, List),第一个列表用于true,第二个列表用于false。
发布于 2017-02-10 00:42:16
 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的列表。
发布于 2017-02-10 00:57:42
我更喜欢使用带有模式匹配的partition。假设list的类型为List[SbcCommandorOrValidationError],并且仅包含ValidatedSbcCommands和FailedValidationSbcCommands,则可以执行以下操作:
val (validatedCommands, failedCommands) = list.partition {
  case command: ValidatedSbcCommand => true
  case _ => false
}这将返回一个(List[SbcCommandorOrValidationError], List[SbcCommandorOrValidationError])类型的元组,其中第一个列表是所有的ValidatedSbcCommands,第二个列表是所有的FailedValidationSbcCommands。
如果您稍后需要访问特定的子类,请不要强制转换。如上使用模式匹配:
validatedCommands.map { 
  case c: ValidatedSbcCommand => functionTakingValidatedSbcCommandsOnly(c) 
}https://stackoverflow.com/questions/42141724
复制相似问题