Преобразование списка в параметр, если он заполнен

У меня есть метод, который должен преобразовать список в Option объекта, или None, если список пуст.

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

case class Bar(fooList: List[Foo]) {}

По какой-то причине мое решение кажется довольно неэлегантным, а не Scala. Кажется, я должен использовать метод List для этого, но я не могу обернуть его вокруг.

Существует ли более Scala -подобный способ сделать это?

Ответ 1

Ответ на вопрос хорош, но я думаю, что это соответствует намерению немного более четко:

Option(myList).filter(_.nonEmpty).map(Bar)

Ответ 2

myList.headOption.map(_ => Bar(myList))

Ответ 3

import scalaz._; import Scalaz._
myList.toNel.map(Bar)

toNel - здесь "непустой список", он возвращает Option[NonEmptyList] для безопасности:

scala> case class Bar(a: NonEmptyList[Int])
defined class Bar

scala> List(1,2,3).toNel.map(Bar)
res64: Option[Bar] = Some(Bar(NonEmptyList(1, 2, 3)))

scala> List[Int]().toNel.map(Bar)
res65: Option[Bar] = None

Ответ 4

Как насчет:

Some(myList) collect { case([email protected]::tl) => Bar(l) }

Кажется симпатичным scala -esque для меня.

Ответ 5

Начиная с Scala 2.13, Option имеет A):Option[A] rel="nofollow noreferrer"> when конструктор:

Option.when(condition)(result)

что в нашем случае дает:

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

Также обратите внимание на A):Option[A] rel="nofollow noreferrer"> 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)))