Scala - 如果数组中包含值,则返回空选项

时间:2012-10-26 08:42:24

标签: scala functional-programming

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

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

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

3 个答案:

答案 0 :(得分:3)

  1. 使用filterOption
  2. 的内容进行测试
  3. 使用exists检查该集合的任何成员是否满足条件。

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

    result.filterNot(_.exists(s => test(s)))
    

答案 1 :(得分:1)

您是否考虑在集合中使用find()?如果它返回Some(x),那么某些东西已满足条件。

list.find(_ < 0) match {
   case Some(x) => None
   case None => Some(list)
}

答案 2 :(得分:0)

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

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

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)))
}

请注意,地图/过滤器结构保持不变,但由于使用了Stream,它现在正在短路。

如果它是真正的大字符串,你可能已经将它作为Stream[Char],这意味着你甚至没有挂在原始字符串上的内存开销。