gpt4 book ai didi

scala - 高效、优雅地从案例类结构列表中删除元素

转载 作者:行者123 更新时间:2023-12-02 07:57:14 26 4
gpt4 key购买 nike

我在 List 中有一个嵌套的 case 类结构

为简单起见,将使用以下示例 -

case class Address(street: String, city: String, state: String, zipCode: Int)
case class Person(firstName: String, lastName: String, addresses: List[Address])
case class Department(people: List[Person])

假设有 List[Department] ;现在,如果我想通过过滤每个没有特定 zipCode 的 PersonAddress 来创建一个新的 List[Department]值;传统上我们可以执行以下操作

def filterPersonsByAddress(dlist: List[Department]): List[Department] = {
dlist.map { d =>
val people = d.people.map { p =>
p.copy(addresses = p.addresses.filterNot(_.zipCode == 38978))}
d.copy(people=people)
}
}

这种方法的性能不佳,因为根据嵌套级别,它可以是 Big O(n^2) 或 Big O(n^3) ;

我正在尝试通过 Monocle 学习镜头。到目前为止,我了解到的是,当您必须“修改”深度嵌套的 case 类结构但尚未找到一种方法来“砍掉”基于以下内容的嵌套结构的某些部分时,Lenses 非常有用条件并返回一个新结构。通过 Monocle 这可能吗?另外,我不确定 Lenses 是否也能帮助实现更好的 Big O 时间?

最佳答案

以下内容在性能方面基本上与您的实现相同,但可以说更清晰:

import monocle.Traversal, monocle.macros.GenLens
import monocle.function.all._, monocle.std.list._

val deptAddresses: Traversal[Department, List[Address]] =
GenLens[Department](_.people)
.composeTraversal(each)
.composeLens(GenLens[Person](_.addresses))

val filterAddresses: Department => Department =
deptAddresses.modify(_.filterNot(_.zipCode == 38978))

这只是构建一个遍历来导航到每个人的地址列表,以便您可以根据谓词对其进行修改。我不确定是否有更好的方法来执行过滤(因为邮政编码不用作唯一索引),但也许 Julien 会考虑其中一种。

关于scala - 高效、优雅地从案例类结构列表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33612548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com