如何在Scala中使用flatMap?

时间:2015-11-06 11:32:33

标签: scala

我有一个清单:

case class Dog(age: Int)
val dogs: List[Dog] = Dog(5) :: Dog(2) :: Dog(2) :: Dog(4) :: Dog(4) :: Dog(4) :: Dog(8) :: Nil

我会列出它会创建等于狗年龄的孩子数量。你可以帮帮我吗?感谢!!!

我想要的结果是:列表[狗] =列表[狗(5),狗(5),狗(5),狗(5),狗(5),狗(2),狗(2) ,狗(2),狗(2)),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4) ),狗(4),狗(4),狗(4),狗(4),狗(8),狗(8),狗(8),狗(8),狗(8),狗(8) ),犬(8),犬(8)]

3 个答案:

答案 0 :(得分:0)

scala> case class Dog(age: Int)
defined class Dog

scala> val dogs: List[Dog] = Dog(5) :: Dog(2) :: Dog(2) :: Dog(4) :: Dog(4) :: Dog(4) :: Dog(8) :: Nil
dogs: List[Dog] = List(Dog(5), Dog(2), Dog(2), Dog(4), Dog(4), Dog(4), Dog(8))

scala> dogs.groupBy(_.age).mapValues(_.size)
res0: scala.collection.immutable.Map[Int,Int] = Map(8 -> 1, 2 -> 2, 5 -> 1, 4 -> 3)

答案 1 :(得分:0)

你的问题有点不清楚,所以你可能想要清理它,但我想我明白你的意思 - 假设你的狗的定义类似

case class Dog(age: Int)

然后你可以像这样创建一个地图

val doggies = dogs map(i => i.age -> i) toMap
doggies: scala.collection.immutable.Map[Int,Dog] = Map(5 -> Dog(5), 2 -> Dog(2), 4 -> Dog(4), 8 -> Dog(8))

顺便说一下,如果你愿意,你可以像这样创建你的列表:

val dogs: List[Dog] = List(Dog(5), Dog(2), Dog(2), Dog(4), Dog(4), Dog(4), Dog(8))

修改

我见过你已经改变了你的问题,你想要这个

scala> dogs.flatMap(i => List.fill(i.age)(i))

res13:列表[狗] =列表(狗(5),狗(5),狗(5),狗(5),狗(5),狗(2),狗(2),狗(2) ),狗(2),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4) ),狗(4),狗(4),狗(4),狗(8),狗(8),狗(8),狗(8),狗(8),狗(8),狗(8) ),狗(8))

其中List.fill(n)(e)将创建一个e f的列表

答案 2 :(得分:0)

我觉得非常简单:

list.flatMap(dog => {for(i< - (0 to dog.age))yield dog.clone})