我将 Option[String] 类型的输入拆分为 Option[Array[String]] ,如下所示:
val input:Option[String] = Option("a=b,1000,what?")
val result: Option[Array[String]] = input map { _.split(",") }
我想添加一个测试,如果数组的任何成员匹配(例如,Long 小于 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),则整个数组将被丢弃并返回一个空选项。
filter
对Option
.exists
检查集合的任何成员是否满足条件。result.filter(! _.exists(s => test(s)))
或者
result.filterNot(_.exists(s => test(s)))
你有没有考虑find()
在收藏中使用?如果它返回 a Some(x)
,那么某些东西满足了条件。
list.find(_ < 0) match {
case Some(x) => None
case None => Some(list)
}
当然,您知道您可以按照@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]
这意味着您甚至没有挂在原始字符串上的内存开销。