gpt4 book ai didi

scala - 我一般如何处理 Scala 集合?

转载 作者:行者123 更新时间:2023-12-04 17:52:39 24 4
gpt4 key购买 nike

我已经意识到我传递 Scala 集合的典型方法可以使用一些改进。

def doSomethingCool(theFoos: List[Foo]) = { /* insert cool stuff here */ }

// if I happen to have a List
doSomethingCool(theFoos)

// but elsewhere I may have a Vector, Set, Option, ...
doSomethingCool(theFoos.toList)

我倾向于编写我的库函数来获取 List作为参数类型,但我确信有一些更通用的东西我可以放在那里以避免所有偶尔的 .toList我在应用程序代码中的调用。这尤其烦人,因为我的 doSomethingCool函数通常只需要调用 map , flatMapfilter , 定义在所有集合类型上。

我对“更一般的东西”有什么选择?

最佳答案

以下是更一般的特征,每个特征都扩展了前一个特征:

  • GenTraversableOnce
  • GenTraversable
  • GenIterable
  • GenSeq

  • 上面的特征没有指定集合是顺序的还是并行的。如果您的代码要求顺序执行(通常,如果您的代码有任何类型的副作用),那么它们就太笼统了。

    以下特征要求顺序执行:
  • TraversableOnce
  • Traversable
  • Iterable
  • Seq
  • LinearSeq

  • 第一个, TraversableOnce只允许您在集合上调用一种方法。之后,该集合已被“使用”。作为交换,它足以接受迭代器和集合。
    Traversable是一个非常通用的集合,具有大多数方法。然而,有些事情它不能做,在这种情况下你需要去 Iterable .

    全部 Iterable实现 iterator方法,它允许您获得 Iterator对于那个集合。这使它能够处理 Traversable 中不存在的一些方法。 .

    一个 Seq[A]实现函数 Int => A ,这意味着您可以通过其索引访问任何元素。这不能保证是有效的,但可以保证每个元素都有一个索引,并且您可以断言该索引将是什么。将此与 Map 对比和 Set ,您无法分辨元素的索引是什么。

    一个 LinearSeqSeq提供快速 head , tail , isEmpty并预先。这是尽可能接近 List没有实际使用 List明确地。

    或者,您可以使用 IndexedSeq ,它具有快速索引访问( List 不提供)。

    另见 this questionthis FAQ基于它。

    关于scala - 我一般如何处理 Scala 集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8605694/

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