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

Nim*_*sky 131 java guava

我有过的快速扫描番石榴API,它提供了新的集合类型(Multimap以及BiMap例如出现有用),我想包括在项目(S)我工作的图书馆.

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

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

Col*_*inD 158

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

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

  • Multimaps很棒.任何时候你都会使用类似的东西Map<Foo, Collection<Bar>>,而是使用multimap来节省大量繁琐的检查,以便对映射到密钥的现有集合进行检查,如果不存在则创建并添加它.
  • Ordering非常适合构建Comparator符合您需求的s.
  • Maps.uniqueIndexMultimaps.index:这些方法采用a Iterable和a来Function构建ImmutableMap或者ImmutableListMultimapIterable通过将函数应用于每个的结果中的值进行索引.因此,使用检索项目ID的函数,您可以按一行中的ID索引项目列表.
  • 它提供的功能...... filter,transform等等.尽管使用Functions和Predicates 类的冗长,但我发现这很有用.我举一个例子来说明这里很好地阅读.
  • ComparisonChain是一个很容易被忽视的小类,当你想要编写一个比较多个连续值的比较方法时,它很有用,并且应该在找到第一个差值时返回.它删除了所有单调,使它只是几行链式方法调用.
  • Objects.equal(Object,Object) - null safe equals.
  • Objects.hashCode(Object...) - 基于班级的多个字段获取哈希码的简便方法.
  • Objects.firstNonNull(Object,Object) - 如果第一个值为null,则减少获取默认值的代码,特别是如果第一个值是方法调用的结果(在以正常方式执行此操作之前,必须将其分配给变量).
  • CharMatcher已经提到过,但它们非常强大.
  • Throwables让你用throwables做一些好事,比如Throwables.propagate如果它是a RuntimeException或a则重新抛出throwable Error并将其包装在a中RuntimeException并抛出其他东西.

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

  • 完全同意`ComparisionChain`. (2认同)

Jon*_*eet 43

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

特别喜欢的部分是:

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

  • 请注意,我们现在在Java 7+中有[StandardCharsets](https://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html).我想知道有多少其他的Guava功能已经进入Java. (6认同)
  • 我发现这个 [Modernizer Maven 插件](https://github.com/andrewgaul/modernizer-maven-plugin) 可以检测遗留 API 的使用,包括 Guava 等第三方库。[配置文件](https://github.com/andrewgaul/modernizer-maven-plugin/blob/master/src/main/resources/modernizer.xml)似乎包含67个Guava弃用,包括StandardCharsets。 (2认同)

dog*_*ane 28

我最初用它来收集藏品.例如,而不是:

Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long, List<String>>>();
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

Map<String, Map<Long, List<String>>> map = Maps.newHashMap();
Run Code Online (Sandbox Code Playgroud)

填充地图也很容易:

ImmutableMap<String,String> map = ImmutableMap.of("key1", "value1", "key2", "value2");
Run Code Online (Sandbox Code Playgroud)

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

CharMatcher.inRange('a','z').or(inRange('A','Z'));
Run Code Online (Sandbox Code Playgroud)

要么

String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789");
Run Code Online (Sandbox Code Playgroud)


Eti*_*veu 21

CharMatcher的precomputed()方法(源代码)是一个很好的"隐藏功能",我前几天偶然发现了.

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

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

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

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                        .or(CharMatcher.DIGIT)
                                        .or(CharMatcher.WHITESPACE)
                                        .precomputed();
Run Code Online (Sandbox Code Playgroud)


Buh*_*ndi 16

以下是来自Google 的YouTube视频(演讲人:Google核心Java库的首席工程师Kevin Bourrillion),该视频展示了Google Collections的精彩之处.谷歌所做的一件事,我认为是辉煌的,是保证收藏品的不变性.


nan*_*nda 12

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

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

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


Dar*_*roy 8

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

  1. 我们非常喜欢Iterators/Iterables和Function接口.
  2. 服务系列接口是很好的抽象
  3. 我们已经如此投入,我们已经开始使用我们的API类型的ImmutableXXX类进行通信,它无法更改.
  4. 在某些情况下,计算地图(来自MapMaker)非常棒.

总的来说,图书馆的质量非常高.API经过深思熟虑,实现稳固.强烈推荐.


Dim*_*eou 7

MapMaker现在提供有界的LRU缓存 - 这是隐藏在微型API背后的一些重要机制.这具有巨大的实用性潜力,而且我仍然遍布代码.