获取Scala中的所有子对象

米恰尔·茹尔祖克(MichałJurczuk)

我有一个这样的模型:

case class Product(id:String, nextVersion:Option[Product] = None)

是否可以获得所有版本的产品?我可以在以下时间使用:

def getAllVersions(product: Product) = {

  var allVersions = List[Product]()
  var actualProduct = product
  while (actualProduct != null) {
    allVersions :+= actualProduct
    actualProduct = actualProduct.nextVersion.orNull
  }

  allVersions
}

但是也许有更好的方法可以做到这一点,更实用吗?

例如:

Product("1", Some(Product("2", Some(Product("3", None)))))

我想获取三个产品“ 1”,“ 2”,“ 3”的列表。

AmigoNico

我猜您的意思是您想从产品链中获取ID的Seq,如下所示:

scala> case class Product(id:String, nextVersion:Option[Product] = None)
defined class Product

scala> val p = Product("1", Some(Product("2", Some(Product("3", None)))))
p: Product = Product(1,Some(Product(2,Some(Product(3,None)))))

scala> def toList(p:Product): List[String] = p match {
         case Product(id, None)       => List(id)
         case Product(id, Some(next)) => id :: toList(next)
       }
toList: (p: Product)List[String]

scala> toList(p)
res2: List[String] = List(1, 2, 3)

尾递归版本将更有效并且不受堆栈溢出的影响:

scala> def toList(p:Product) = {
         @tailrec def loop(p: Product, soFar: List[String]): List[String] =
           p match {
            case Product(id, None)       =>            id :: soFar
            case Product(id, Some(next)) => loop(next, id :: soFar)
           }
         loop(p, Nil).reverse
       }
toList: (p: Product)List[String]

scala> toList(p)
res4: List[String] = List(1, 2, 3)

尽管最好用以下方法来完成此任务Vector:创建的对象更少,不需要在最后进行反转,并且如果调用者希望非顺序地访问结果,则效率更高。但是让我们返回a,Seq以便我们以后可以更改类型:

scala> def toList(p:Product): Seq[String] = {
         @tailrec def loop(p: Product, soFar: Vector[String]): Vector[String] =
           p match {
             case Product(id, None)       =>            soFar :+ id
             case Product(id, Some(next)) => loop(next, soFar :+ id)
           }
         loop(p, Vector())
       }
toList: (p: Product)Seq[String]

scala> toList(p)
res5: Seq[String] = Vector(1, 2, 3)

以下版本较短,并且不是显式递归的-回叫toList是从内部完成的Option#map但是,这当前意味着不会在递归上完成尾部调用优化(Scala编译器无法执行,而JVM当前不执行),因此如果产品版本链为,这可能会导致堆栈溢出足够长了。而且它的效率将低于上面的代码。

scala> def toList(p:Product): List[String] =
         p.id :: (p.nextVersion map toList getOrElse Nil)
toList: (p: Product)List[String]

scala> toList(p)
res1: List[String] = List(1, 2, 3)

您可以定义和使用Iterator[Product],如下所示:

scala> implicit def productIterator(firstP: Product) = new Iterator[Product] {
         private var optP = Option(firstP)
         def hasNext = optP.isDefined
         def next =
           if (hasNext) {
             val p = optP.get
             optP = p.nextVersion
             p
           } else {
             sys error "read past end of Iterator[Product]"
           }
       }
productIterator: (firstP: Product)Iterator[Product]

scala> (p map (_.id)).toList
res22: List[String] = List(1, 2, 3)

但是,由于您的数据结构是递归的,因此遍历它的代码必须是递归的(显式或隐式的)或使用可变变量(Iterator确实如此)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Scala中获取所有枚举用例对象的值

来自分类Dev

从...可变深度对象的子对象的所有子对象中获取属性

来自分类Dev

从...可变深度对象的子对象的所有子对象中获取属性

来自分类Dev

如何在Scala中使用反射获取所有对象值和子对象值?

来自分类Dev

如何在Scala中使用反射获取所有对象值和子对象值?

来自分类Dev

如何获取对象列表中包含的所有子对象的列表?

来自分类Dev

从对象及其子对象获取所有名称

来自分类Dev

如何从包含在 ArrayList 中的对象中获取所有子字段?

来自分类Dev

从包中获取所有子包

来自分类Dev

如何从Firebase中的所有子位置获取特定的对象值

来自分类Dev

mongodb从所有文档中获取所有子文档

来自分类Dev

获取对象数组中的所有参数

来自分类Dev

从列表中获取所有对象

来自分类Dev

使用所有子文档mongo meteor获取不同的对象对

来自分类Dev

从树型对象数组Javascript获取所有子记录

来自分类Dev

“ childNodes”未获取SVG对象的所有子节点

来自分类Dev

选择子子对象中的所有键

来自分类Dev

使用 ramda 在嵌套数组中查找具有给定 id 的对象,获取除子数组之外的所有属性

来自分类Dev

获取对象JSON Java Android中的所有对象

来自分类Dev

获取自连接对象及其子对象上的所有关联对象

来自分类Dev

从对象中获取具有特定值的所有键

来自分类Dev

如何使用Scala获取XML文件的所有子级和子级

来自分类Dev

遍历div中的所有div(包括子对象)

来自分类Dev

如何显示模板中的所有子对象?

来自分类Dev

Scala获取列表中的所有元素小于特定值

来自分类Dev

使用反射获取在Scala中实现特征的所有类

来自分类Dev

如何从 Scala 的地图列表中获取所有值?

来自分类Dev

c ++子获取当前目录中的所有exe文件

来自分类Dev

如何从数组及其子数组中获取所有值

Related 相关文章

  1. 1

    在Scala中获取所有枚举用例对象的值

  2. 2

    从...可变深度对象的子对象的所有子对象中获取属性

  3. 3

    从...可变深度对象的子对象的所有子对象中获取属性

  4. 4

    如何在Scala中使用反射获取所有对象值和子对象值?

  5. 5

    如何在Scala中使用反射获取所有对象值和子对象值?

  6. 6

    如何获取对象列表中包含的所有子对象的列表?

  7. 7

    从对象及其子对象获取所有名称

  8. 8

    如何从包含在 ArrayList 中的对象中获取所有子字段?

  9. 9

    从包中获取所有子包

  10. 10

    如何从Firebase中的所有子位置获取特定的对象值

  11. 11

    mongodb从所有文档中获取所有子文档

  12. 12

    获取对象数组中的所有参数

  13. 13

    从列表中获取所有对象

  14. 14

    使用所有子文档mongo meteor获取不同的对象对

  15. 15

    从树型对象数组Javascript获取所有子记录

  16. 16

    “ childNodes”未获取SVG对象的所有子节点

  17. 17

    选择子子对象中的所有键

  18. 18

    使用 ramda 在嵌套数组中查找具有给定 id 的对象,获取除子数组之外的所有属性

  19. 19

    获取对象JSON Java Android中的所有对象

  20. 20

    获取自连接对象及其子对象上的所有关联对象

  21. 21

    从对象中获取具有特定值的所有键

  22. 22

    如何使用Scala获取XML文件的所有子级和子级

  23. 23

    遍历div中的所有div(包括子对象)

  24. 24

    如何显示模板中的所有子对象?

  25. 25

    Scala获取列表中的所有元素小于特定值

  26. 26

    使用反射获取在Scala中实现特征的所有类

  27. 27

    如何从 Scala 的地图列表中获取所有值?

  28. 28

    c ++子获取当前目录中的所有exe文件

  29. 29

    如何从数组及其子数组中获取所有值

热门标签

归档