功能基于Scala中的值创建列表

时间:2014-12-17 16:48:20

标签: scala collections functional-programming

我有一个遍历元组序列的任务,并根据元组中的最后一个值创建一个案例类Item的1个或多个副本。我可以用foreach和Mutable List解决这个任务。当我学习FP和Scala集合时,可以使用Scala中的不可变集合和高阶函数来实现更多功能方式吗?

例如,输入:

List[("A", 2), ("B", 3), ...]

输出:

List[Item("A"), Item("A"), Item("B"),Item("B"),Item("B"), ...]

2 个答案:

答案 0 :(得分:5)

对于使用flatMap生成List.fill[A](n: Int)(elem: ⇒ A) List elem次的n的每个元组scala> val xs = List(("A", 2), ("B", 3), ("C", 4)) xs: List[(String, Int)] = List((A,2), (B,3), (C,4)) scala> case class Item(s: String) defined class Item scala> xs.flatMap(x => List.fill(x._2)(Item(x._1))) res2: List[Item] = List(Item(A), Item(A), Item(B), Item(B), Item(B), Item(C), Item(C), Item(C), Item(C))

{{1}}

答案 1 :(得分:1)

flatten用于case class Item(v: String),如下所示

myList.map{ case(s,n) => List.fill(n)(Item(s)) }.flatten

还有这样的理解,

for ( (s,n) <- myList ; l <- List.fill(n)(Item(s)) ) yield l

这是调用flatMap的语法糖。

List.fill之外,请考虑使用List.tabulate初始化列表,例如以这种方式,

for ( (s,n) <- myList ; l <- List.tabulate(n)(_ => Item(s)) ) yield l