Guava库:它最有用和/或隐藏的功能是什么?

时间:2010-09-21 10:35:04

标签: java guava

我快速扫描了Guava API及其提供的新集合类型(例如MultimapBiMap看起来很有用),我想将库包含在我工作的项目。

然而,如果它们没有什么好处并且学习这些功能浪费了宝贵的时间,我也不愿意将这些图书馆包括在内。

您是否已将Guava库包含在项目中并且以任何意外方式证明它有用?你将来会一直使用它吗?它的主要优点/节省时间是什么?它隐藏的功能是什么?

8 个答案:

答案 0 :(得分:157)

说真的,番石榴中的所有东西都很有用。我已经使用了很长一段时间了,而且我仍然总是发现一些新东西,我可以用它来做,所需的代码少于手工操作。

其他一些事情并没有真正提到我喜欢的事情:

  • Multimap很棒。任何时候你都会使用像Map<Foo, Collection<Bar>>这样的东西,而是使用多图,并为自己节省大量繁琐的检查,查看映射到密钥的现有集合,如果不存在则创建并添加它。
  • Ordering非常适合构建行为正常的Comparator
  • Maps.uniqueIndexMultimaps.index:这些方法采用IterableFunction并构建ImmutableMapImmutableListMultimap,用于索引值通过将函数应用于每个函数的结果Iterable。因此,使用检索项目ID的函数,您可以按一行中的ID索引项目列表。
  • 它提供的功能...... filtertransform等。尽管使用FunctionPredicate的类很复杂,但我发现这很有用。我举了一个例子来说明这个很好地阅读here
  • ComparisonChain是一个容易被忽视的小类,当您想要编写一个比较多个连续值并且在找到第一个差异时应该返回的比较方法时,这个类非常有用。它删除了所有的单调乏味,使它只是几行链式方法调用。
  • Objects.equal(Object,Object) - null safe equals。
  • Objects.hashCode(Object...) - 根据班级的多个字段获取哈希码的简便方法。
  • Objects.firstNonNull(Object,Object) - 如果第一个值为null,则减少获取默认值的代码,特别是如果第一个值是方法调用的结果(在执行此操作之前必须将其分配给变量)正常的方式)。
  • CharMatcher已被提及,但它们非常强大。
  • Throwables允许你使用throwables做一些不错的事情,例如Throwables.propagate如果它是RuntimeExceptionError则会重新抛出throwable并将其包装在{RuntimeException中1}}并抛出其他的。

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

答案 1 :(得分:42)

我已经在Google内部使用Guava几年了 - 这太棒了。

特别喜欢的部分是:

  • Charsets.* - 这么简单,非常有用
  • 集合
  • IO处理(完全在一行中读取资源等)
  • Splitter / Joiner
  • Preconditions

答案 2 :(得分:28)

我最初将它用于收藏短片。例如,而不是:

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

答案 3 :(得分:21)

CharMatcher的precomputed()方法(source是一个不错的“隐藏功能”,我前几天偶然发现了。

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

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

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

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

答案 4 :(得分:16)

以下是来自Google的YouTube video(发言人:Kevin Bourrillion,Google核心Java库的首席工程师),展示了Google Collections的魅力。谷歌所做的一件事,我认为是辉煌的,保证集合中的不变性。

答案 5 :(得分:12)

Google Guava是一个实用程序库,所以我怀疑其中有一个杀手类。关于效用的全部内容是你几乎在每个项目中使用它。我不记得我做过的任何不使用Java集合的项目。事实上,Google Guava的收集实用程序很棒,应该在Java SDK本身。

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

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

答案 6 :(得分:8)

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

  1. 我们非常喜欢Iterators / Iterables和Function接口。
  2. 服务系列接口是很好的抽象
  3. 我们已经如此认可,我们已经开始使用我们的API类型的ImmutableXXX类来传达它无法更改。
  4. 计算地图(来自MapMaker)在某些情况下非常棒。
  5. 总的来说,图书馆的质量非常高。 API经过深思熟虑,实现稳固。强烈推荐。

答案 7 :(得分:7)

MapMaker现在提供有界的LRU缓存 - 这是隐藏在微型API背后的一些重要机制。这有可能带来巨大的效用,而且我仍然遍布整个代码。