Ответ 1
Ответ на вопрос хорош, но я думаю, что это соответствует намерению немного более четко:
Option(myList).filter(_.nonEmpty).map(Bar)
У меня есть метод, который должен преобразовать список в 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 -подобный способ сделать это?
Ответ на вопрос хорош, но я думаю, что это соответствует намерению немного более четко:
Option(myList).filter(_.nonEmpty).map(Bar)
myList.headOption.map(_ => Bar(myList))
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
Как насчет:
Some(myList) collect { case([email protected]::tl) => Bar(l) }
Кажется симпатичным scala -esque для меня.
Начиная с 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)))