译文出处: 花名有孚   原文出处:takipi.com

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来使用,但要记清楚它可是无符号的:

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

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

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

1
2
3
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中的实现:

1
2
3
4
5
6
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对象:

1
2
3
4
5
6
7
8
9
10
Funnel<Person>
personFunnel =
newFunnel<Person>()
{
   @Override
   publicvoid

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库中的竞争者相比,它还提供了许多专门的方法。我们来看一个简单的例子:

1
2
3
4
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中我们非常喜欢的一个特性,它还能获取当前运行环境的许多相关信息。使用起来非常简单:

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

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

5: CharMatcher:简化版正则?

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

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

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

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

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

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

结论

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

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

from:http://www.importnew.com/15476.html

Google Guava的5个鲜为人知的特性的更多相关文章

  1. 使用 Google Guava 美化你的 Java 代码

    文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMP ...

  2. (翻译)Google Guava Cache

    翻译自Google Guava Cache This Post is a continuation of my series on Google Guava, this time covering G ...

  3. Guava 教程2-深入探索 Google Guava 库

    原文出处: oschina 在这个系列的第一部分里,我简单的介绍了非常优秀的Google collections和Guava类库,并简要的解释了作为Java程序员,如果使用Guava库来减少项目中大量 ...

  4. Google Guava入门(一)

    Guava作为Java编程的助手,可以提升开发效率,对Guava设计思想的学习则极大的有益于今后的编程之路.故在此对<Getting Started with Google Guava>一 ...

  5. [Google Guava] 11-事件总线

    原文链接 译文连接 译者:沈义扬 传统上,Java的进程内事件分发都是通过发布者和订阅者之间的显式注册实现的.设计EventBus就是为了取代这种显示注册方式,使组件间有了更好的解耦.EventBus ...

  6. [Google Guava] 6-字符串处理:分割,连接,填充

    原文链接 译文链接 译者:沈义扬,校对:丁一 连接器[Joiner] 用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦.如果字符串序列中含有null,那连接操作会更难.Fluent风格的Joine ...

  7. [Google Guava] 3-缓存

    原文地址  译文地址    译者:许巧辉  校对:沈义扬 范例 01 LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() ...

  8. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

  9. java开发人员,最应该学习和熟练使用的工具类。google guava.(谷歌 瓜娃)

    学习参考文章: http://blog.csdn.net/wisgood/article/details/13297535 http://ifeve.com/google-guava/ http:// ...

随机推荐

  1. Linux中Mysql root用户看不到mysql库问题解决方式

    第一种方式: 1.首先停止MySQL服务:service mysqld stop2.加参数启动mysql:/usr/bin/mysqld_safe --skip-grant-tables &  ...

  2. 解决使用web开发手机网页关于分辨率被缩放的坑

    问题的产生 因为各方面原因,要用网页做界面,开发一个APP.内核使用的是腾讯的x5内核. 把外壳交给前端和设计测试的时候,都汇报:状态栏的颜色太不搭配了,要求可修改 遂启用了安卓4.4版本开始支持的沉 ...

  3. sourceTree+gerrit管理代码

    第一次接触gerrit,会对这种代码管理方式非常排斥,尤其是习惯了用sourceTree配合git进行代码管理的同学.不爽归不爽,代码还得写,我们的目标是让开发过程爽起来. 关于gerrit的知识,移 ...

  4. python学习之路网络编程篇(第四篇)

    python学习之路网络编程篇(第四篇) 内容待补充

  5. delphi 线程教学第七节:在多个线程时空中,把各自的代码塞到一个指定的线程时空运行

    第七节:在多个线程时空中,把各自的代码塞到一个指定的线程时空运行     以 Ado 为例,常见的方法是拖一个 AdoConnection 在窗口上(或 DataModule 中), 再配合 AdoQ ...

  6. JavaScript 字符串(String)对象

    String 对象用于处理已有的字符块. JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". 一个字符串可以使用单引号或双引号: 实例 var ...

  7. android 小项目------黑名单app

    周一的时候,同事在群里问到了黑名单功能,他说网上都没有找到一个完整的,记得谁说过一句,当都没有做过的时候,这就是机会.这几天公司事比较多,只能晚上抽时间写写,直到今天才完整的做出来. 具体效果的话大家 ...

  8. python转lua最容易掉进去的坑--作用域

    你以为会依次打印2,4,8吗? 错. 2,2,2 value = 1 for i=1,3 do local value = value*2 print(value) end 你以为打印1吗?,错,输出 ...

  9. Latex 文本编辑技巧

    临时取消首行缩进 \noindent 生成随机文本 \usepackage{lipsum} \begin{document} \lipsum \end{document} 多栏模式 \usepacka ...

  10. CocoaChina(总结)升级到xcode8遇到的问题及解决方案

    此总结由CocoaChina论坛版主wo709128079及广大坛友共同汇总.>>查看原帖 升级Xcode8已是必然,升级iOS 10的用户不能说大有人在,应该也不会少,楼主听说,如果不升 ...