Scala-列表接受-OrElse-具有默认值

时间:2019-04-28 20:45:57

标签: scala list collections take

我正在尝试实现一种从Scala列表中提取n的方法,但是i f n > list.length请指定默认值。类似于takeOrElse。

val l = List(4, 6, 10)

val taken = l.takeOrElse(5, 0) //List(4, 5, 6, 0, 0)

有没有一种方法可以惯常地做到这一点而无需突变和缓冲?感谢您的投入。

2 个答案:

答案 0 :(得分:4)

您可以在take上使用padToList函数。

take返回一个新的List,其中包含列表的前n个元素;如果n小于列表的长度,则返回整个列表。

padTo函数将向List添加元素,直到其长度等于其第一个参数中的值。如果列表已经足够长,它将不会执行任何操作。

赞:

val taken = l.take(5).padTo(5, 0)

答案 1 :(得分:3)

您可以使用.padTo

scala> val l = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)

scala> l.take(5).padTo(len = 5, elem = 0)
res5: List[Int] = List(1, 2, 3, 0, 0)

类似的问题:Scala - Pad an array to a certain size

您还可以在takeOrElse上写扩展方法List[Int]

scala>     implicit class ListOps(list: List[Int]) {
     |       def takeOrElse(length: Int, elem: Int): List[Int] = {
     |         list.take(length).padTo(len = length, elem = elem)
     |       }
     |     }
defined class ListOps

scala> val newList = l.takeOrElse(5, 0)
newList: List[Int] = List(1, 2, 3, 0, 0)

另请参阅:Scala extension methods?