4

我有一个类型的 Scala 值Option[Set[String]],我试图在收集filter方法中使用它:

val opt: Option[Set[String]] = ...

collection.filter {
  value =>
  opt match {
    case Some(set) => set.contains(value)
    case None => true
  }
}

如果opt值为Some(...)我想使用封闭Set来过滤集合,否则我想包含集合中的所有项目。

是否有更好(更惯用)的方式来使用Optionmap、、、filtergetOrElse)?

来自opt一个可选的命令行参数,其中包含要包含的术语列表。如果缺少命令行参数,则包括所有术语。

4

2 回答 2

8

Set[A]我会使用扩展A => Boolean并将常量函数返回true到的事实getOrElse

val p: String => Boolean = opt.getOrElse(_ => true)

或者:

val p = opt.getOrElse(Function.const(true) _)

现在你可以只写collection.filter(p). 如果您想要单线,以下任一方法也可以:

collection filter opt.getOrElse(_ => true)
collection filter opt.getOrElse(Function.const(true) _)
于 2012-05-18T12:35:54.377 回答
6

过滤似乎有点浪费,_ => true所以我更喜欢

opt match {
  case Some(s) => collection filter s
  case None    => collection
}

我想这相当于:

opt map (collection filter) getOrElse collection
于 2012-05-18T13:12:41.427 回答