Scala - список дублей - OrElse - со значением по умолчанию - PullRequest
2 голосов
/ 28 апреля 2019

Я пытаюсь реализовать способ получения n из списка Scala, но я f n > list.length, укажите значение по умолчанию.Что-то вроде takeOrElse.

Скажем, val l = List(4, 6, 10)

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

Есть ли способ сделать это идиоматически без мутаций и буферов?Цените ваши вклады.

Ответы [ 2 ]

4 голосов
/ 28 апреля 2019

Вы можете использовать функции take и padTo на List.

take возвращает новый List с n первыми элементами списка или весь список, если n меньше длины списка.

Функция padTo будет добавлять элементы в List до тех пор, пока его длина не станет равной значению в первом параметре. Это ничего не даст, если список уже достаточно длинный.

Как это:

val taken = l.take(5).padTo(5, 0)
3 голосов
/ 28 апреля 2019

Вы можете использовать .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 - дополняет массив до определенного размера

Вы также можете написать метод расширения 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?

...