【发布时间】:2016-11-10 18:41:41
【问题描述】:
在 Scala 中,表达这一点:
val opt:Option[String] = Some("a")
if(opt.isEmpty) "" else opt.get
您可以在Options 上使用此fold 模式:
opt.fold("")(_)
但是 fold 在集合上的行为不同。我怎样才能在不写的情况下为集合实现同样的效果:
case class Container(description: String, collection: Seq)
val col = Seq()
if(col.nonEmpty) {
Some(Container("some description", col))
} else {
None
}
换句话说,我如何优雅地只在Some()集合不为空的情况下返回它?
【问题讨论】:
-
你试过
headOption吗?或headOption.map(whatevergoeshere) -
另外,
if(opt.isEmpty) "" else opt.get会更符合opt.getOrElse("")的习惯 -
为什么
if/else不“优雅”?对我来说这是完美的发现。如果您出于某种原因不想要if/else,这是一种方法:Some(col).filter(_.nonEmpty).map(c => Container("some description", c)) -
这种行为与
Option上的fold有何相同之处? -
因为
Some(col).filter(_.nonEmpty)基本上是if (col.nonEmpty) Some(col) else None。然后,你map在你的Container构造函数上,它只转换Some案例,这意味着它与if (col.nonEmpty) { val c = col; Some(Container("some description", c)) } else None相同,正如你所看到的,它与你的“不优雅”sn 相同-p.
标签: scala collections scala-collections