在Scala中映射整个列表

时间:2017-04-09 14:57:27

标签: scala scala-collections

我希望能够像这样做

List(1, 2, 3).someFunc?(list => List(list, list)) // List(List(1,2,3), List(1,2,3))

一般的想法是我想要像map那样的smth,但不是在列表的元素上,而是在整个列表本身上。另一种方法是写这样的smth:

val list = List(1, 2, 3)
val res = List(list, list)

但是我想要一些可以在链中使用的功能。有这样的功能吗?

编辑: 理想情况下,我希望将地图链接到元素和这种"类型的地图"对于整个列表可以互换,例如

 List(1, 2, 3).map(_ + 1).someFunc?(list => List(list, list))

3 个答案:

答案 0 :(得分:2)

您可以轻松定义自己的运算符:

implicit class RichList[T](l: List[T]){
  def applyFun[U](f: List[T] => U): U = f(l)
}

您甚至可以对可应用的函数的输出类型添加一些限制,例如,如果您想确保输出仍然是列表(只需将U替换为List[U] as f的输出和applyFun[U]的输出。)

答案 1 :(得分:1)

我认为一个选项很适合您的需求:

Option(List(1, 2, 3)).map(lst => List(lst, lst))

您可能还想考虑视频流:

Stream.continually(List(1, 2, 3)).take(2).toList

然后,您可以根据需要映射此列表列表。

答案 2 :(得分:1)

我认为你可以在这里使用模式匹配:

List(1, 2, 3) match { case x => List(x, x) }
// res25: List[List[Int]] = List(List(1, 2, 3), List(1, 2, 3))