我有一个遍历元组序列的任务,并根据元组中的最后一个值创建一个案例类Item的1个或多个副本。我可以用foreach和Mutable List解决这个任务。当我学习FP和Scala集合时,可以使用Scala中的不可变集合和高阶函数来实现更多功能方式吗?
例如,输入:
List[("A", 2), ("B", 3), ...]
输出:
List[Item("A"), Item("A"), Item("B"),Item("B"),Item("B"), ...]
答案 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