Google Guava的5个鲜为人知的特性

标签: google guava 人知 | 发表时间:2015-03-27 18:37 | 作者:
出处:http://it.deepinmind.com

image

Google Guava有哪些比较冷门但却又实用的特性呢?

它是最流行的开源库之一,你应该听过它的大名,它诞生的地方正是人们举办真正的魁地奇比赛的地方(起码 实习期内是这样的)。它虽然不是来自哈利波特中的霍格沃兹学校,但却有着自己的专属魔力:Google Guava库包含着许多诞生于Google的核心Java库,这些都是公开发布后在生产环境经历过了各种检验的。 在Java 8之前它就已经包含Optional了。

Guava致力于提升常见任务的开发效率,通过它所提供的功能,开发人员能够高效地完成更优质且更干净的代码。最著名的莫过于它里面的集合库和缓存库了。然而,它的很多非常实用的功能却鲜为人知。说到集合和缓存,Guava库对JDK中的集合API进行了改进,同时它还填补了 直到去年才最终发布的JCache的空缺( 令人望眼欲穿)。本文我和大家分享的是在Takipi里面我们所用到的一些Google Guava的特性,以及我们的一些有趣的发现。

注意:Guava支持Java 6及以上的版本。

1. 无符号基础类型:它们真的存在!

Java 8中一个不太为人所知的特性就是它为无符号基础类型所提供的新的解决方案。但更加不为人所知的是在Java 8发布很久之前Guava库就已经有了这个功能了,目前在Java 6及以后的版本中均能使用。我们来看下Guava是如何解决这个问题的。现在在我们面前有两种选择,到底使用哪种最好保持一致:

直接将基础类型当int来使用,但要记清楚它可是无符号的:

   int notReallyInt = UnsignedInts.parseUnsignedInt(4294967295); // Max unsigned int
 
String maxUnsigned = UnsignedInts.toString(notReallyInt); // We’re legit!

UnsignedInts与UnsignedLongs还支持compare, divide, min, max等方法。

你还可以使用包装类型,这样能避免直接使用基础类型容易带来的混淆:

   UnsignedInteger newType = UnsignedInteger.valueOf(maxUnsigned);
 
newType = newType.plus(UnsignedInteger.valueOf("1")); // Increment

UnsignedInts与UnsignedLongs还支持minus, times, dividedBy以及mod方法。

2. 哈希:128位的MurmurHash

看一下Java标准库中的非加密哈希算法你会发现少了 MurmurHash,这是一个简单高效且还是分布式的算法,在许多语言中都有着很好的支持。我们并不是说要用它来取代Java的hashCode方法,不过如果你想要生成大量的哈希值而32位已经不够用了,但又希望能有一个高效而不会影响到性能的算法,那肯定就是它了。下面是Guava中的实现:

   HashFunction hf = Hashing.murmur3_128(); // 32bit version available as well
HashCode hc = hf.newHasher()
   .putLong(id)
   .putString(name, Charsets.UTF_8)
   .putObject(person, personFunnel)
   .hash();
  
  

你可以使用Funnel来对对象进行分解,里面包含了用于读取对象的指令,假设我们有一个带ID,名字以及出生年份的Person对象:

   Funnel<Person> personFunnel = new Funnel<Person>() {
   @Override
   public void funnel(Person person, PrimitiveSink into) {
   into
      .putInt(person.id)
      .putString(person.firstName, Charsets.UTF_8)
      .putString(person.lastName, Charsets.UTF_8)
      .putInt(birthYear);
   }
};

3. InternetDomainName:用它来取代你的域名校验器

Guava还有一个很酷的功能就是它的InternetDomainName,用它来解析及修改域名简直是得心应手。如果你自己写过类似的功能的话,你就会知道它提供的方式是多高效优雅了。它是Mozilla基金会发起的项目,遵循最新的RFC规范,它采用的是 公共后缀列表(Public Suffix List, PSL)中的域名列表。与apache-common库中的竞争者相比,它还提供了许多专门的方法。我们来看一个简单的例子:

   InternetDomainName owner =
   InternetDomainName.from("blog.takipi.com").topPrivateDomain(); // returns takipi.com
 
InternetDomainName.isValid(“takipi.monsters"); // returns false

关于域名有几个概念是比较容易混淆的:publicSuffix()返回的是对应着公共后缀列表中的独立实体的顶级域名。因此返回的可能会有co.uk, .com, .cool这样的结果(没错,.cool是一个真实的后缀,比如 javais.cool, scalais.cool以及cppis.cool)。而topPrivateDomain(),这是对应公共后缀列表的一个独立实体的私有域名。在blog.takipi.com上调用这个方法会返回takipi.com,但如果你把它用于某个github主页,比如username.github.io的话则会返回username.github.io,因为这在PSL上是一个单独的实体。

当你需要校验域名的时候这个功能就派上用场了,比如我们最近给将JIRA集成进Takipi的时候,首先我们要检查你的JIRA域名,然后才能连接到Takipi的生产环境的错误分析工具中。

4. ClassPath反射:魔镜,魔镜

看一下Java的反射机制,也就是它的查看自身代码的能力,你会发现,要想列出所在包或者项目中的所有类可不是一件简单的事情。这是Guava中我们非常喜欢的一个特性,它还能获取当前运行环境的许多相关信息。使用起来非常简单:

   ClassPath classpath = ClassPath.from(classloader);
for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClasses("com.mycomp.mypackage")) {
   System.out.println(classInfo.getName());
}

这段代码会遍历你指定包中的所有类并打印出它们的名字。这里要说明的是它只会扫描我们指定的包的物理路径下的类。如果类是从其它地方加载进来的则不在此列,因此使用它的时候请务必小心,不然你得到的结果就是错误的了。

5: CharMatcher:简化版正则?

我们用一个你肯定会碰到过的问题来结束这最后一个特性。假设你有一个字符串,或者许多字符串,你希望对它们进行格式化,比如删除空格或者别的字符,替换某个字符等等。总的来说,就是提取匹配某个模式的字符然后进行某个操作。Guava提供了CharMatcher,使得这类问题的处理更得更加优雅。

对于这类任务,库里有许多预定义好的模式,比如JAVA UPPERCASE(大写字符),JAVA_DIGIT(数字),INVISIBLE(不可见UNICODE字符)等。除了这些预定义的模式外,你还可以创建自己想要的模式。我们用一段简短的示例来看下它是如何使用的:

   String spaced = CharMatcher.WHITESPACE.trimAndCollapseFrom(string, ‘ ‘);

它会截取掉字符串末尾的空格并将中间连续的空格合并成一个。

   String keepAlex = CharMatcher.anyOf(“alex”).retainFrom(someOtherString);

而这行会将一个字符串中我的名字里没有的字符都去掉。如果我是一名说唱歌手的话,这将是我的歌曲扬名之时。

结论

这里我们介绍了Google Guava库中的一些非常有趣的特性,当然了,不包括家喻户晓的集合库以及缓存库。这里面有些功能是在Takipi中广泛用到的,而有些功能是我们觉得比较实用,相信许多项目都能从中受益的。Google Guava库让开发人员变得更加高效,而这也正是我们Takipi所开发的工具想要实现的目标(它可是相当酷的, 不信你可以试试

我们很想知道你用过的哪个Guava特性是别人可能不太会用到的?(集合和缓存当然不算!)请在下方的评论中分享给大家吧。

英文原文链接

相关 [google guava 人知] 推荐:

Google Guava的5个鲜为人知的特性

- - Java译站
Google Guava有哪些比较冷门但却又实用的特性呢. 它是最流行的开源库之一,你应该听过它的大名,它诞生的地方正是人们举办真正的魁地奇比赛的地方(起码 实习期内是这样的). 它虽然不是来自哈利波特中的霍格沃兹学校,但却有着自己的专属魔力:Google Guava库包含着许多诞生于Google的核心Java库,这些都是公开发布后在生产环境经历过了各种检验的.

Google Guava Collections 使用介绍

- 半兽人 - IBM developerWorks 中国 : Java technology : Articles,Tutorials
Google Guava Collections 是一个对 Java Collections Framework 增强和扩展的一个开源项目. 由于它高质量 API 的实现和对 JDK5 特性的充分利用,使得其在 Java 社区受到很高评价. 笔者主要介绍它的基本用法和功能特性.

Google Guava v11 Collections示例

- - 龙浩的blog
Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库. 这里先介绍一下最常用的com.google.common.collect包中的最常用的一些API,仅仅讨论一下API的使用方法,没有讨论到实现细节.      1:Collections的构造方法.

[Google Guava] 排序: Guava强大的”流畅风格比较器”

- - 并发编程网 - ifeve.com
原文链接 译者: 沈义扬. 排序器[Ordering]是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能. 从实现上说,Ordering实例就是一个特殊的Comparator实例. Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器.

Google Guava官方教程(中文版)

- - Java - 编程语言 - ITeye博客
原文链接   译文链接  译者: 沈义扬, 罗立树,何一昕, 武祖   校对:方腾飞. Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等.

Guava cache

- - 孟飞阳的博客
Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制. 整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好.    Guava Cache有两种创建方式:.   通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值.

Java Cache系列之Guava Cache

- - BlogJava-首页技术区
然而作为工具库中的一部分,我们自然不能期待Guava对Cache有比较完善的实现. 因而Guava中的Cache只能用于一些把Cache作为一种辅助设计的项目或者在项目的前期为了实现简单而引入. 在Guava CacheBuilder的注释中给定Guava Cache以下的需求:. 对于这样的需求,如果要我们自己来实现,我们应该怎么设计.

[转][转]Redis、Memcached、Guava、Ehcache中的算法

- - heiyeluren的blog(黑夜路人的开源世界)
缓存那些事,一是内存爆了要用LRU(最近最少使用)、LFU(最少访问次数)、FIFO的算法清理一些;二是设置了超时时间的键过期便要删除,用主动或惰性的方法. 今天看 Redis3.0的发行通告里说,LRU算法大幅提升了,就翻开源码来八卦一下,结果哭笑不得,这旧版的"近似LRU"算法,实在太简单,太偷懒,太Redis了.

维度数据实时关联的实践(w/ Flink、Vert.x & Guava Cache) - 简书

- -
在流式处理作业(特别是实时数仓ETL作业)中,我们的数据流可以视为无界事实表,其中往往缺乏一些维度信息. 例如,对于埋点日志流而言,为了减少传输冗余,可能只会带有城市ID、商品ID等,如果要映射到对应的名称,就需要与外部存储中的维度表进行关联. 这里的外部存储一般是指适合OLTP场景的数据库,如MySQL、Redis、HBase等.

基于Google Reader的个人知识管理方案

- 土豆 - 中文热文榜|最新
methanol 在 GoogleReader 说. 还有 joey, LiuWeifeng, 推荐,查看全部 83 个推荐 84 次分享. 月光博客发表于2010-05-10 09:03:35.   先前我写的《基于Dropbox的个人知识管理平台》讲述了使用Dropbox在个人知识管理的保存知识方面的技巧,而个人知识管理的另一个重要环节是获取知识,今天月光博客就介绍一下如何通过Google Reader快速的阅读、标记、分类和存储各类知识的技巧.