Scala 根据一定数量的必需元素和已知的第一个元素生成元素集合

Scala generate a collection of elements based on a number of required elements and a known first element

正在寻找一种优雅的 Scala 方法来根据大量必需元素和已知的第一个元素生成元素集合。

例如:

def generateListOfData(numberOfElements: Int = 1): Seq[Data] = {
if(numberOfElements == 1)
   Seq(aData(id = id)) //aData is some builder
else 
   // generate a `Seq` of elements with `id = randomInt`
}

最优雅的方法是什么?

您可以生成从 1numberOfElements - 1 的范围,将其映射到 Data 并添加默认元素:

def generateListOfData(numberOfElements: Int = 1): Seq[Data] = {
    if (numberOfElements > 0) {
      val rnd = new scala.util.Random
      aData(id = id) +: (1 to numberOfElements - 1)
        .map(_ => aData(id = rnd.nextInt()))
    }
    Seq[Data]()
}

或使用 foldLeft 并与守卫进行模式匹配:

def generateListOfData(numberOfElements: Int = 1): Seq[Data] = {
    val rnd = new scala.util.Random
    numberOfElements match {
      case _ if numberOfElements > 0 => (1 to numberOfElements - 1)
        .foldLeft(Seq(aData(id = id))) { (acc, _) => aData(id = rnd.nextInt()) +: acc }
        .reverse
      case _ => Seq()
    }
}

正如我常说的,Scaladoc 是你的朋友。
您可以使用 tabulate 来获得您想要的结果。

def generateListOfData(numberOfElements: Int = 1): Seq[Data] =
  Seq.tabulate(numberOfElements) { n =>
    if (n == 1) aData(id = id) else aData(id = randomInt)
  }

您也可以这样使用 fill

def generateListOfData(numberOfElements: Int = 1): Seq[Data] =
  aData(id = id) :: List.fill(numberOfElements - 1)(aData(id = randomInt))

PS:如果numberOfElements不是正数,上述方法将抛出异常。