Если вы хотите более идиоматическое решение, рассмотрите возможность использования шаблона классов типов (неявные классы в scala).
implicit class ListOps[A](list: List[A]) {
def getRandomElement: Option[A] = list match {
case Nil => None
case _ => list.lift(scala.util.Random.nextInt(list.size))
}
def randomChoice(n: Int): Option[List[A]] =
(1 to n).toList.foldLeft(Option(List[A]()))((acc, e) => getRandomElement.flatMap(r => acc.map(a => a :+ r)))
}
Теперь, если неявный класс находится в области видимости, вы можете:
val randomElement: Option[String] = List("this", "is", "a", "list").getRandomElement
Если вы уверены, что опция содержит какое-то значение, вы можете использовать метод get
.
randomElement.get // This will return a String (or a NotSuchElementExeption)
Тем не менее, рекомендуется сопоставление с шаблоном или getOrElse
:
randomElement match {
case None => ??? // This is what you do when a None is encounter (e.g. for empty lists)
case Some(result) => ??? // The variable result contains a string.
Обратите внимание , что метод randomChoice
предполагает замену элементов.