尋找一種優雅的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`
}
最優雅的方法是什么?
uj5u.com熱心網友回復:
正如我常說的,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不是肯定的,上面的方法會拋出例外。
uj5u.com熱心網友回復:
您可以生成 range from1以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()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422307.html
標籤:
