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

yur*_*ura 31 java scala guava scala-collections

有很多共同的概念:

  • 不可变的集合,
  • 集合视图,
  • 严格/不严格的收藏,
  • 集合建设者

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

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

Kev*_*ght 26

谷歌番石榴是一个很棒的图书馆,毫无疑问.但是,它是用Java实现的,并且受到以下所有限制的影响:

  • 标准库中没有不可变的集合接口
  • 没有lambda文字(闭包),所以在例如谓词所需的SAM类型周围有一些沉重的样板
  • 类型规范中有很多重复,特别是涉及泛型的地方

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

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

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

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

  • +1"标准库中没有不可变的集合接口." Guava必须实现可变接口并在可变方法上返回异常,从而导致可能的运行时异常......呃 (5认同)
  • +1我认为你发现了一个最大的差异.虽然在运行时检查Guava不变性,但在编译时检查Scala不变性. (4认同)

par*_*tic 7

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

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

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