首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据匹配模式分离scala列表

根据匹配模式分离scala列表
EN

Stack Overflow用户
提问于 2017-02-10 00:18:59
回答 4查看 91关注 0票数 0

我有一个以下scala特征的列表。如何将列表分成两部分,一个只包含ValidatedSbcCommand对象,另一个只包含FailedValidationSbcCommand对象?

代码语言:javascript
运行
复制
sealed trait SbcCommandorOrValidationError 
case class ValidatedSbcCommand(sbcCommand: SbcCommand) extends SbcC  ommandorOrValidationError
case class FailedValidationSbcCommand(sbcCommandError: SbcCommandError) extends SbcCommandorOr
EN

回答 4

Stack Overflow用户

发布于 2017-02-10 00:23:51

在list上使用partition方法。它接受一个谓词并生成一个(List, List),第一个列表用于true,第二个列表用于false。

票数 1
EN

Stack Overflow用户

发布于 2017-02-10 00:42:16

代码语言:javascript
运行
复制
 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
EN

Stack Overflow用户

发布于 2017-02-10 00:57:42

我更喜欢使用带有模式匹配的partition。假设list的类型为List[SbcCommandorOrValidationError],并且仅包含ValidatedSbcCommands和FailedValidationSbcCommands,则可以执行以下操作:

代码语言:javascript
运行
复制
val (validatedCommands, failedCommands) = list.partition {
  case command: ValidatedSbcCommand => true
  case _ => false
}

这将返回一个(List[SbcCommandorOrValidationError], List[SbcCommandorOrValidationError])类型的元组,其中第一个列表是所有的ValidatedSbcCommands,第二个列表是所有的FailedValidationSbcCommands。

如果您稍后需要访问特定的子类,请不要强制转换。如上使用模式匹配:

代码语言:javascript
运行
复制
validatedCommands.map { 
  case c: ValidatedSbcCommand => functionTakingValidatedSbcCommandsOnly(c) 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42141724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档