如果填充了列表,则将列表转换为选项

Cor*_*ein 14 scala

我有一个方法应该将列表转换Option为一个对象,或者None如果列表为空.

def listToOption(myList: List[Foo]): Option[Bar] = {
  if(myList.nonEmpty) Some(Bar(myList))
  else None
}

case class Bar(fooList: List[Foo]) {}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我的解决方案感觉相当不优雅,而不是Scala方式.看来我应该可以使用一种方法List来做这种事情,但我无法绕过它.

是否有更像Scala的方式来做到这一点?

Ale*_*nov 22

Lee的答案很好,但我认为这更符合意图:

Option(myList).filter(_.nonEmpty).map(Bar)
Run Code Online (Sandbox Code Playgroud)


Lee*_*Lee 9

myList.headOption.map(_ => Bar(myList))
Run Code Online (Sandbox Code Playgroud)

  • 这个力量很大. (2认同)

Xav*_*hot 5

开始Scala 2.13Option有一个when建设者:

Option.when(condition)(result)
Run Code Online (Sandbox Code Playgroud)

在我们的案例中,它给出:

Option.when(myList.nonEmpty)(Bar(myList))
// val myList = List[Int]()    =>    Option[Bar] = None
// val myList = List(1, 2)     =>    Option[Bar] = Some(Bar(List(1, 2)))
Run Code Online (Sandbox Code Playgroud)

另请注意Option.unless会引起相反情况的因素:

Option.unless(myList.isEmpty)(Bar(myList))
// val myList = List[Int]()    =>    Option[Bar] = None
// val myList = List(1, 2)     =>    Option[Bar] = Some(Bar(List(1, 2)))
Run Code Online (Sandbox Code Playgroud)