我已经快速扫描了 番石榴原料药和它提供的新集合类型(例如,Multimap和 BiMap似乎很有用) ,我正在考虑将该库包括在我工作的项目中。
Multimap
BiMap
然而,如果库没有什么好处,并且学习这些特性会浪费宝贵的时间,那么我也不会随意地包含它们。
您是否在项目中包含了 Guava 库,并且它是否以任何意想不到的方式被证明是有用的?你以后会一直用它吗?它的主要好处是什么?它的隐藏特征是什么?
在谷歌内部,我已经有效地使用番石榴好几年了——它非常棒。
我最喜欢的部分是:
Splitter
Joiner
Preconditions
谷歌番石榴是一个实用程序库,所以我怀疑有一个杀手级内部。关于实用程序的所有事情就是你几乎在你所有的项目中都使用它。我不记得我做过任何不使用 Java 集合的项目。事实上,GoogleGuava 的集合工具非常棒,应该在 JavaSDK 中。
我写了三篇关于谷歌番石榴课程的文章:
CheckedFuture
ListenableFuture
这还不是全部,你还可以用番石榴做很多其他的事情。
这是一个来自 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");
说真的,番石榴里的东西都很有用。我已经使用它很长一段时间了,并且仍然总是发现一些新的东西,我可以用它来做比手工做更少的代码。
其他人没有真正提到我喜欢的一些东西:
Map<Foo, Collection<Bar>>
Ordering
Comparator
Maps.uniqueIndex
Multimaps.index
Iterable
Function
ImmutableMap
ImmutableListMultimap
filter
transform
Predicate
ComparisonChain
Objects.hashCode(Object...)
Objects.firstNonNull(Object,Object)
CharMatcher
Throwables
Throwables.propagate
RuntimeException
Error
我当然可以继续,但我得去工作了。=)无论如何,尽管我在这里列出了一些我喜欢的东西,但事实是,番石榴中的一切在某些情况下都是有用的。它们中的大部分经常是有用的。当你使用它的时候,你会发现更多的用途。不使用它会感觉有点像有一只手被绑在你的背后。
CharMatcher 的 precomputer ()方法(来源) 是我前几天偶然发现的一个不错的“隐藏特性”。
它实际上只是一种优化,创建一个查找表(使用位数组) ,然后简单地查找字符以查看它们是否“匹配”。
这是一种在使用库时可以利用的隐藏优化,您可能在自己的代码中没有考虑到自己。
当然, 如果创建一个复杂的 CharMatcher (计划多次使用它) ,则必须记住调用 precomputer ()方法,比如:
CharMatcher complexMatcher = CharMatcher.anyOf("cat") .or(CharMatcher.DIGIT) .or(CharMatcher.WHITESPACE) .precomputed();
绝对非常非常有用。它几乎总是第一个添加到新项目中的库。
总的来说,这个库的质量非常高。 API 是经过深思熟虑的,实现非常可靠。强烈推荐。
MapMaker 现在提供了有界限的 LRU 缓存——这是一些隐藏在微小 API 背后的实质性机器。这有巨大的潜力,实用性,我仍然在所有的代码。