谷歌番石榴vs Scala收集框架比较

时间:2011-07-06 14:57:45

标签: java scala guava scala-collections

有很多共同的概念:

  • immutable collection,
  • 集合视图,
  • 严格/非严格收集,
  • 收藏建设者

Guava和Scala Collection API中的相同模式。 那么区别是什么呢?这两个库是否与模式一致?扩展的可行性是否良好?

所以我想听听那些使用它们的人的框架的比较。

4 个答案:

答案 0 :(得分:26)

Google Guava是一个很棒的图书馆,毫无疑问。但是,它是用Java实现的,并且受到所有限制的影响:

  • 标准库中没有不可变的集合接口
  • 没有lambda文字(闭包),因此围绕例如所需的SAM类型存在一些沉重的样板。谓词
  • 类型规范中存在大量重复,特别是在涉及泛型的情况下

Guava也必须存在于Java的标准集合库中,因此第三方库很少会公开与番石榴兼容的函数文字或使用特定于guava的集合类型。这会导致您使用的每个第三方库的阻抗不匹配。例如,您通常希望将这些库中的返回集合转换为适当的guava不可变集合 - 尤其是在多线程环境中工作时。

Scala集合的设计可以更好地集成到该语言中,您会发现它们在scala标准库中以及在Scala中实现的第三方产品中得到广泛使用。默认情况下,Scala集合也是不可变的,因此您最终会得到更安全的代码,不需要额外的防御包装层。

如果您可以使用Scala,那么它除了集合框架之外还有许多优点。如果你必须使用Java,那么Guava是一个不错的选择,特别是考虑到没有Scala提供的语言功能,Scala集合不是特别容易使用。

在一个混合项目中,Guava集合可以在Scala中完全使用,但该语言还提供了允许您使用Java集合(包括公开相同接口的Guava)的机制,就好像它们是Scala自己的集合一样。

答案 1 :(得分:7)

我现在在所有的java项目中使用guava。它为具有相似模式的java集合提供了一个很好的功能触摸。

然而,在java中编写闭包意味着直接定义大量的匿名类,这很冗长乏味。

Scala集合在设计方面(由于特征而具有部分实现的级联)和功能仍然优越。只需实现一小组方法,就可以轻松创建自己的集合并获得scala集合的所有优势。

答案 2 :(得分:4)

其他人已经回答了你的问题,但我认为你错过了一个有趣的选择,Functional Java图书馆。它忽略了Java Collection API,并提供了不可变的集合,其外观和行为类似于简化的Scala集合。

答案 3 :(得分:3)

我使用过Scala,Google系列和F#。最近我一直在使用Google集合迭代器并且忽略了F#序列表达式的强大功能。看起来Scala更喜欢迭代器/序列上的非严格(懒惰)列表。

在F#和Google集合中(请参阅google Iterators),您可以转换和过滤迭代器,从而创建一个很好的推送工作管道,表示为对象流。它并不是说你不能在Scala中做到这一点并不常见。 F#有一个很酷的管道运算符,用于过滤迭代器(序列)。

例如,我希望Scala的yield表达式生成像Python(或F#序列块)这样的迭代器,而不是返回一个列表。

两者非常相似,Scala在速度和语法方面具有巨大的优势,但在使用它们时我觉得(我的观点):

  • Google系列专注于Map和Iterator。
  • Scala非常关注List。

注意看起来Scala 2.8在其集合中做了一些重大更改(我使用的是旧版本的Scala)。