Java的番石榴图书馆; 它最有用和/或隐藏的特性是什么?
我已经对Guava API进行了快速扫描,并提供了新的集合types(例如Multimap
和BiMap
),我正在考虑将该库BiMap
到我正在使用的项目中。 然而,如果图书馆没有太多的好处,而且学习这些特性浪费宝贵的时间,我也会无动于衷。
您是否将番石榴图书馆列入您的项目,并以任何意想不到的方式certificate有用? 你会在将来总是使用它吗? 它的主要优点/节省时间是什么? 它的隐藏function是什么?
说真的,番石榴的一切都很有用。 我已经使用了很长一段时间了,我仍然总是发现一些新的东西,我可以用它代替less量的代码。
其他一些事情还没有真正提到我爱:
-
Multimap
s很棒。 任何时候你会使用像Map<Foo, Collection<Bar>>
,而是使用一个multimap,并且保存大量冗长的检查映射到一个键的现有集合,如果它不存在,就创build并添加它。 -
Ordering
对于构buildComparator
是非常棒的。 -
Maps.uniqueIndex
和Multimaps.index
:这些方法使用Iterable
和Function
并构build一个ImmutableMap
或ImmutableListMultimap
,通过将函数应用到每个Iterable
的结果来对Iterable
的值进行索引。 所以用一个检索一个项目ID的函数,你可以在一行中用它们的ID索引一个项目列表。 - 它提供的function性内容…
filter
,transform
等。尽pipe使用类的Function
和Predicate
的冗长,我发现这很有用。 我举一个例子说明如何在这里很好的阅读。 -
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上的课程的文章:
- 使用
CheckedFuture
: http :CheckedFuture
- 使用
ListenableFuture
: http :ListenableFuture
- Google收集(现在是Guava)上的
ComputingMap
http://blog.firdau.si/2009/11/13/computing-map-on-google-collections/
这还不是全部,你可以用番石榴做很多其他的事情。
绝对非常有用。 几乎总是第一个join到新项目中的图书馆。
- 我们非常喜欢Iterators / Iterables和Function接口。
- 服务系列的接口是伟大的抽象
- 我们如此承诺,我们已经开始使用我们的APItypes的ImmutableXXX类来进行通信,以至于无法更改。
- 计算地图(来自MapMaker)在某些情况下非常棒。
总的来说,图书馆质量非常高。 这个API是经过深思熟虑的,实现的很扎实。 强烈推荐。
MapMaker现在提供了有界的LRUcaching – 这是一些隐藏在一个小API后面的重要机器。 这有巨大的实用性的潜力,我仍然遍布代码。