如何从scala中的对象子列表中过滤元素?

时间:2017-10-04 18:20:47

标签: scala filter functional-programming

我有一个对象列表[T],每个对象都有另一个对象列表[M]。我想过滤掉内部列表M给定值以进行比较。

以下是此类列表的示例:

case class People(val name: String, val pets: List[Pet])

case class Pet(val name: String, val `type`: String)

val noisyNeighbors = List(
  People(
    "Obelix", 
    List(
      Pet("koko", "cat"),
      Pet("kiki", "dog")
    )
  ),
  People(
    "Asterix", 
    List(
      Pet("piki", "lizard"),
      Pet("poko", "dog")
    )
  )
)

鉴于val petTypeToRemove = "dog",我希望得到一个结果列表:

val lessNoisyNeighbors = List(
  People(
    "Obelix", 
    List(
      Pet("koko", "cat")
    )
  ),
  People(
    "Asterix", 
    List(
      Pet("piki", "lizard")
    )
  )
)

我尝试过一些事情,但我真的不知道从哪里开始:

val lessNoisyNeighbors = noisyNeighbors.filter {
  ???
}

2 个答案:

答案 0 :(得分:0)

在邻居的map上调用List,并为每个邻居替换一个已过滤掉指定类型的宠物的副本。请注意,此处没有任何内容发生变异。

val petTypeToRemove = "dog"

val lessNoisyNeighbors =
  noisyNeighbors.map(n => n.copy(pets = n.pets.filterNot(_.`type` == petTypeToRemove)))

答案 1 :(得分:0)

您不想过滤邻居(来自您希望如何处理Asterix)。

HttpResponse

可能需要对其进行一些修饰(例如,尽可能保留参考平等,或者删除只有宠物可以移除的人),但这是基本的骨架。