加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

我如何一般地处理Scala集合?

发布时间:2020-12-16 18:19:53 所属栏目:安全 来源:网络整理
导读:我已经意识到我传递 Scala集合的典型方式可以使用一些改进. def doSomethingCool(theFoos: List[Foo]) = { /* insert cool stuff here */ }// if I happen to have a ListdoSomethingCool(theFoos)// but elsewhere I may have a Vector,Set,Option,...doSom
我已经意识到我传递 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,flatMap和filter,它们都是在所有集合类型上定义的.

对于那种“更普遍的东西”,我有哪些选择?

解决方法

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

> GenTraversableOnce
> GenTraversable
> GenIterable
> GenSeq

上述特征未指定集合是顺序还是并行.如果您的代码要求按顺序执行某些操作(通常,如果您的代码具有任何类型的副作用),则它们过于笼统.

以下特征要求顺序执行:

> TraversableOnce
>可穿越
> Iterable
> Seq
> LinearSeq

第一个,TraversableOnce只允许您在集合上调用一个方法.之后,该集合已被“使用”.作为交换,它通常足以接受迭代器和集合.

Traversable是一个非常通用的集合,拥有大多数方法.但有些事情是不能做的,在这种情况下你需要去Iterable.

所有Iterable都实现了迭代器方法,它允许您获取该集合的迭代器.这使它能够使用Traversable中不存在的一些方法.

Seq [A]实现函数Int => A,表示您可以通过索引访问任何元素.这不能保证有效,但它保证每个元素都有一个索引,并且您可以对该索引的内容进行断言.将其与Map和Set进行对比,您无法分辨元素的索引.

LinearSeq是一个提供快速head,tail,isEmpty和prepend的Seq.这是尽可能接近List而不实际明确使用List.

或者,您可以拥有一个IndexedSeq,它具有快速索引访问权限(List不提供).

另见this question和this FAQ.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读