在 Scala 中映射整个列表

Map whole list in Scala

我希望能够这样做

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

总体思路是我想要像 map 一样的东西,但不是作用于列表的元素,而是作用于整个列表本身。另一种方法是这样写:

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

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

编辑: 理想情况下,我想链接映射元素和整个列表的 "kind of map" 可互换,例如

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

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

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

您可能还想考虑流:

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

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

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

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

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

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

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