番石榴库: 它最有用和/或最隐藏的特性是什么?

我已经快速扫描了 番石榴原料药和它提供的新集合类型(例如,MultimapBiMap似乎很有用) ,我正在考虑将该库包括在我工作的项目中。

然而,如果库没有什么好处,并且学习这些特性会浪费宝贵的时间,那么我也不会随意地包含它们。

您是否在项目中包含了 Guava 库,并且它是否以任何意想不到的方式被证明是有用的?你以后会一直用它吗?它的主要好处是什么?它的隐藏特征是什么?

43907 次浏览

在谷歌内部,我已经有效地使用番石榴好几年了——它非常棒。

我最喜欢的部分是:

  • 如此简单,如此有用
  • 收款
  • IO 处理(完全在一行中读取资源等)
  • Splitter/Joiner
  • Preconditions

谷歌番石榴是一个实用程序库,所以我怀疑有一个杀手级内部。关于实用程序的所有事情就是你几乎在你所有的项目中都使用它。我不记得我做过任何不使用 Java 集合的项目。事实上,GoogleGuava 的集合工具非常棒,应该在 JavaSDK 中。

我写了三篇关于谷歌番石榴课程的文章:

这还不是全部,你还可以用番石榴做很多其他的事情。

这是一个来自 Google 的 YouTube 视频(演讲者: Kevin Bourrillion,Google 核心 Java 库的首席工程师) ,它展示了 Google 收藏的美。谷歌做的一件事,我相信是辉煌的,是 保证不变的集合。

我最初将它用于集合速记:

Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long, List<String>>>();

你可以这样做:

Map<String, Map<Long, List<String>>> map = Maps.newHashMap();

填充地图也很容易:

ImmutableMap<String,String> map = ImmutableMap.of("key1", "value1", "key2", "value2");

现在,我在番石榴中发现了一些其他有用的实用工具。例如,CharMatcher类允许您匹配字符序列。你可以这样做:

CharMatcher.inRange('a','z').or(inRange('A','Z'));

或者

String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789");

说真的,番石榴里的东西都很有用。我已经使用它很长一段时间了,并且仍然总是发现一些新的东西,我可以用它来做比手工做更少的代码。

其他人没有真正提到我喜欢的一些东西:

  • Multimap很棒。任何时候你想使用类似于 Map<Foo, Collection<Bar>>的东西,使用一个 multimap 代替,为你自己节省了大量繁琐的检查现有的集合映射到一个键,并创建和添加它,如果它不在那里。
  • Ordering是伟大的建设 Comparator的行为只是你想要的。
  • Maps.uniqueIndexMultimaps.index: 这些方法采用一个 Iterable和一个 Function,并构建一个 ImmutableMapImmutableListMultimap,该 ImmutableMapImmutableListMultimap通过对每个函数应用的结果来索引 Iterable中的值。因此,使用检索项的 ID 的函数,您可以在一行中根据项的 ID 对项列表进行索引。
  • 它提供的功能性的东西... filtertransform等等。尽管对 FunctionPredicate使用类有些冗长,但我发现这很有用。我给出一个例子,一种方法,使这读起来很好的 给你
  • ComparisonChain是一个很小的、容易被忽略的类,当您想要编写一个比较方法来连续比较多个值时,它非常有用,并且在找到第一个差异时应该返回。它消除了所有这些繁琐的工作,使它只是几行链式方法调用。
  • 空安全等于。
  • Objects.hashCode(Object...)-基于类的多个字段获取哈希代码的简单方法。
  • Objects.firstNonNull(Object,Object)-如果第一个值为 null,减少获取默认值的代码,特别是如果第一个值是方法调用的结果(在正常方法执行之前,必须将它赋给一个变量)。
  • CharMatcher已经提到过了,但是它们非常强大。
  • Throwables允许您使用可抛物体做一些很好的事情,例如 Throwables.propagate,它重新抛出一个可抛物体(如果它是 RuntimeExceptionError) ,并将其包装在 RuntimeException中,否则抛出。

我当然可以继续,但我得去工作了。=)无论如何,尽管我在这里列出了一些我喜欢的东西,但事实是,番石榴中的一切在某些情况下都是有用的。它们中的大部分经常是有用的。当你使用它的时候,你会发现更多的用途。不使用它会感觉有点像有一只手被绑在你的背后。

CharMatcher 的 precomputer ()方法(来源) 是我前几天偶然发现的一个不错的“隐藏特性”。

它实际上只是一种优化,创建一个查找表(使用位数组) ,然后简单地查找字符以查看它们是否“匹配”。

这是一种在使用库时可以利用的隐藏优化,您可能在自己的代码中没有考虑到自己。

当然, 如果创建一个复杂的 CharMatcher (计划多次使用它) ,则必须记住调用 precomputer ()方法,比如:

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
.or(CharMatcher.DIGIT)
.or(CharMatcher.WHITESPACE)
.precomputed();

绝对非常非常有用。它几乎总是第一个添加到新项目中的库。

  1. 我们非常喜欢迭代器/迭代器和函数接口。
  2. 服务接口家族是非常抽象的
  3. 我们已经开始使用我们的 API 类型的 ImmutableXXX 类来进行通信,以至于它不能被更改。
  4. 在某些情况下,计算地图(来自 MapMaker)是非常棒的。

总的来说,这个库的质量非常高。 API 是经过深思熟虑的,实现非常可靠。强烈推荐。

MapMaker 现在提供了有界限的 LRU 缓存——这是一些隐藏在微小 API 背后的实质性机器。这有巨大的潜力,实用性,我仍然在所有的代码。