Java的番石榴图书馆; 它最有用和/或隐藏的特性是什么?

我已经对Guava API进行了快速扫描,并提供了新的集合types(例如MultimapBiMap ),我正在考虑将该库BiMap到我正在使用的项目中。 然而,如果图书馆没有太多的好处,而且学习这些特性浪费宝贵的时间,我也会无动于衷。

您是否将番石榴图书馆列入您的项目,并以任何意想不到的方式certificate有用? 你会在将来总是使用它吗? 它的主要优点/节省时间是什么? 它的隐藏function是什么?

说真的,番石榴的一切都很有用。 我已经使用了很长一段时间了,我仍然总是发现一些新的东西,我可以用它代替less量的代码。

其他一些事情还没有真正提到我爱:

  • Multimap s很棒。 任何时候你会使用像Map<Foo, Collection<Bar>> ,而是使用一个multimap,并且保存大量冗长的检查映射到一个键的现有集合,如果它不存在,就创build并添加它。
  • Ordering对于构buildComparator是非常棒的。
  • Maps.uniqueIndexMultimaps.index :这些方法使用IterableFunction并构build一个ImmutableMapImmutableListMultimap ,通过将函数应用到每个Iterable的结果来对Iterable的值进行索引。 所以用一个检索一个项目ID的函数,你可以在一行中用它们的ID索引一个项目列表。
  • 它提供的function性内容… filtertransform等。尽pipe使用类的FunctionPredicate的冗长,我发现这很有用。 我举一个例子说明如何在这里很好的阅读。
  • ComparisonChain是一个小的,容易被忽略的类,当你想编写一个比较方法来连续比较多个值并且在find第一个差异时应该返回的时候是很有用的。 它消除了所有的乏味,使得它只是几行链式方法调用。
  • Objects.equal(Object,Object) – null安全等于。
  • Objects.hashCode(Object...) – 基于类的多个字段获取哈希代码的简单方法。
  • Objects.firstNonNull(Object,Object) – 如果第一个值为null,则减less获取默认值的代码,特别是如果第一个值是方法调用的结果(在执行此操作之前必须将其分配给variables正常的方式)。
  • CharMatcher已经被提及,但是它们非常强大。
  • Throwables可以让你用throwables做一些很好的事情,比如Throwables.propagate ,如果它是一个RuntimeException或者一个Error ,则抛出一个throwable,并且把它包装在一个RuntimeException ,否则抛出。

我当然可以继续,但我必须去工作。 =)无论如何,尽pipe我已经列出了一些我喜欢的东西,事实上番石榴的一切在某种情况下都是有用的。 其中很多是非常有用的。 当你使用它,你会发现更多的用途。 不使用它会感觉有点像一只手绑在背后。

我已经在谷歌内部有效地使用了番石榴几年了,这真是太好了。

特别喜欢的部分是:

  • Charsets.* – 如此简单,如此有用
  • 集合
  • IO处理(完全在一行中读取资源等)
  • Splitter /连接Splitter
  • Preconditions

我最初用它来收集简写。 例如,而不是:

 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"); 

CharMatcher的预计算()方法( 源代码 )是我偶然发现的一个很好的“隐藏function”。

这实际上只是一个优化,创build一个查找表(使用位数组),然后只是查找字符,看看他们是否“匹配”。

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

当然,如果你创build了一个复杂的CharMatcher,你打算多次使用,你必须记得调用precomputed()方法,如:

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

这里有来自Google的YouTubevideo (演讲者:Google核心Java库的首席工程师Kevin Bourrillion),展示了Google Collections的优点。 Google所做的一件事,我相信是非常出色的,它保证了系列产品的不变性。

谷歌番石榴是一个实用程序库,所以我怀疑其中有一个杀手级。 关于效用的一切都是你在每个项目中都用到的。 我不记得任何我没有使用Java集合的项目。 事实是,Google Guava的收集工具非常棒,应该在Java SDK本身。

我已经写了三篇关于Google Guava上的课程的文章:

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

绝对非常有用。 几乎总是第一个join到新项目中的图书馆。

  1. 我们非常喜欢Iterators / Iterables和Function接口。
  2. 服务系列的接口是伟大的抽象
  3. 我们如此承诺,我们已经开始使用我们的APItypes的ImmutableXXX类来进行通信,以至于无法更改。
  4. 计算地图(来自MapMaker)在某些情况下非常棒。

总的来说,图书馆质量非常高。 这个API是经过深思熟虑的,实现的很扎实。 强烈推荐。

MapMaker现在提供了有界的LRUcaching – 这是一些隐藏在一个小API后面的重要机器。 这有巨大的实用性的潜力,我仍然遍布代码。