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`
}
最优雅的方法是什么?
您可以生成从 1
到 numberOfElements - 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
不是正数,上述方法将抛出异常。
正在寻找一种优雅的 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`
}
最优雅的方法是什么?
您可以生成从 1
到 numberOfElements - 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
不是正数,上述方法将抛出异常。