0

我将 Option[String] 类型的输入拆分为 Option[Array[String]] ,如下所示:

val input:Option[String] = Option("a=b,1000,what?")
val result: Option[Array[String]] = input map { _.split(",") }

我想添加一个测试,如果数组的任何成员匹配(例如,Long 小于 0),则整个数组将被丢弃并返回一个空选项。

4

3 回答 3

3
  1. 用于filterOption.
  2. 用于exists检查集合的任何成员是否满足条件。

result.filter(! _.exists(s => test(s)))

或者

result.filterNot(_.exists(s => test(s)))
于 2012-10-26T08:48:13.113 回答
1

你有没有考虑find()在收藏中使用?如果它返回 a Some(x),那么某些东西满足了条件。

list.find(_ < 0) match {
   case Some(x) => None
   case None => Some(list)
}
于 2012-10-26T08:46:36.207 回答
0

当然,您知道您可以按照@ziggystar 的建议进行拆分然后过滤,但是如果您有一个非常大String的元素并且在开头匹配了一个元素,那么当您知道它将被丢弃时完成拆分字符串是没有意义的。

在这种情况下,如果您担心时间效率,可以使用 aStream并重新实现拆分操作,如下所示:

def result(input:Option[String]):Option[Seq[String]] = {
  def split(c: Char, chars:Stream[Char]):Stream[String] = {
    val (head,tail) = chars span(_ != c)
    head.mkString #:: (if(tail isEmpty) Stream.empty else split(c, tail tail))
  }

  input map {s => split(',', Stream(s:_*)) } filter (_.forall (s => !test(s)))
}

请注意,map/filter 结构保持不变,但由于使用Stream.

如果它是一个非常大的字符串,您可能已经拥有它,Stream[Char]这意味着您甚至没有挂在原始字符串上的内存开销。

于 2012-10-26T14:34:21.310 回答