Scala糖用于Seq的选项

时间:2013-11-16 11:43:01

标签: scala functional-programming option

我需要映射一个序列,如果为空则认为它是一个None而不是一个空序列。所以:

val quote_ =
quote_inner_element.map( q=> {
  val quote_link_regex(quote_link_id) = q.attr("href")
  Quote(quote_link_id.toInt)
})
val quote = if(quote_.isEmpty) None else Some(quote_)

我讨厌定义两个变量。如果我做

val quote = Option(
quote_inner_element.map( q=> {
  val quote_link_regex(quote_link_id) = q.attr("href")
  Quote(quote_link_id.toInt)
}))

因为我获得了大量的Some(Seq())。什么是糖,糖爸爸?

2 个答案:

答案 0 :(得分:2)

implicit class SeqAugment[T](val s: Seq[T]) {
   final def toOption: Option[Seq[T]] = if (s.isEmpty) None else Some(s);
}
val s = Seq(1, 2, 3);
s.toOption

答案 1 :(得分:2)

您可以通过多种方式避免创建两个顶级val:

使用内部val:

val quote = {
  val quote = fooQuote map(q => myFunc(q))
  if (quote.isEmpty) None else Some(quote)
}

请注意,即使val名称相同,它们也不会引用相同的值;内在的一个遮住外面。

使用匹配表达:

val quote = fooQuote map(q => myFunc(q)) match { case q => if (q.isEmpty) None else Some(q) }