谷歌番石榴与斯卡拉收集框架比较

2022-09-01 10:51:09

有很多共同的概念:

  • 不可变集合,
  • 集合视图,
  • 严格/非严格收集,
  • 集合生成器

番石榴和Scala Collection API中的相同模式。那么有什么区别呢?这两个库是否与模式一致?扩展的可憎性就足够了吗?

因此,我想听听同时使用它们的人对这些框架的比较。


答案 1

谷歌番石榴是一个梦幻般的图书馆,毫无疑问。但是,它是在Java中实现的,并且受到所有限制,这意味着:

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

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

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

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

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


答案 2

我现在在所有java项目中都使用番石榴。它为具有类似模式的java集合提供了很好的功能触感。

但是,在java中编写闭包意味着直接定义许多匿名类,这很冗长且无聊。

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


推荐