Google Guava的5个鲜为人知的特性
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
|
intnotReallyInt4294967295);// String// |
UnsignedInts与UnsignedLongs还支持compare, divide, min, max等方法。
你还可以使用包装类型,这样能避免直接使用基础类型容易带来的混淆:
|
1
2
3
|
UnsignedInteger newType"1"));// |
UnsignedInts与UnsignedLongs还支持minus, times, dividedBy以及mod方法。
2. 哈希:128位的MurmurHash
看一下Java标准库中的非加密哈希算法你会发现少了MurmurHash,这是一个简单高效且还是分布式的算法,在许多语言中都有着很好的支持。我们并不是说要用它来取代Java的hashCode方法,不过如果你想要生成大量的哈希值而32位已经不够用了,但又希望能有一个高效而不会影响到性能的算法,那肯定就是它了。下面是Guava中的实现:
|
1
2
3
4
5
6
|
HashFunction//HashCode .putLong(id) .putString(name, .putObject(person, .hash(); |
你可以使用Funnel来对对象进行分解,里面包含了用于读取对象的指令,假设我们有一个带ID,名字以及出生年份的Person对象:
|
1
2
3
4
5
6
7
8
9
10
|
Funnel<Person>newFunnel<Person>() @Override publicvoid into .putInt(person.id) .putString(person.firstName, .putString(person.lastName, .putInt(birthYear); }}; |
3. InternetDomainName:用它来取代你的域名校验器
Guava还有一个很酷的功能就是它的InternetDomainName,用它来解析及修改域名简直是得心应手。如果你自己写过类似的功能的话,你就会知道它提供的方式是多高效优雅了。它是Mozilla基金会发起的项目,遵循最新的RFC规范,它采用的是公共后缀列表(Public
Suffix List, PSL)中的域名列表。与apache-common库中的竞争者相比,它还提供了许多专门的方法。我们来看一个简单的例子:
|
1
2
3
4
|
InternetDomainName InternetDomainName.from("blog.takipi.com").topPrivateDomain();// InternetDomainName.isValid(“takipi.monsters");// |
关于域名有几个概念是比较容易混淆的: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
|
ClassPathfor(ClassPath.ClassInfo"com.mycomp.mypackage")) System.out.println(classInfo.getName());} |
这段代码会遍历你指定包中的所有类并打印出它们的名字。这里要说明的是它只会扫描我们指定的包的物理路径下的类。如果类是从其它地方加载进来的则不在此列,因此使用它的时候请务必小心,不然你得到的结果就是错误的了。
5: CharMatcher:简化版正则?
我们用一个你肯定会碰到过的问题来结束这最后一个特性。假设你有一个字符串,或者许多字符串,你希望对它们进行格式化,比如删除空格或者别的字符,替换某个字符等等。总的来说,就是提取匹配某个模式的字符然后进行某个操作。Guava提供了CharMatcher,使得这类问题的处理更得更加优雅。
对于这类任务,库里有许多预定义好的模式,比如JAVAUPPERCASE(大写字符),JAVA_DIGIT(数字),INVISIBLE(不可见UNICODE字符)等。除了这些预定义的模式外,你还可以创建自己想要的模式。我们用一段简短的示例来看下它是如何使用的:
|
1
|
String |
它会截取掉字符串末尾的空格并将中间连续的空格合并成一个。
|
1
|
String |
而这行会将一个字符串中我的名字里没有的字符都去掉。如果我是一名说唱歌手的话,这将是我的歌曲扬名之时。
结论
这里我们介绍了Google Guava库中的一些非常有趣的特性,当然了,不包括家喻户晓的集合库以及缓存库。这里面有些功能是在Takipi中广泛用到的,而有些功能是我们觉得比较实用,相信许多项目都能从中受益的。Google Guava库让开发人员变得更加高效,而这也正是我们Takipi所开发的工具想要实现的目标(它可是相当酷的,不信你可以试试)
我们很想知道你用过的哪个Guava特性是别人可能不太会用到的?(集合和缓存当然不算!)请在下方的评论中分享给大家吧。
from:http://www.importnew.com/15476.html
Google Guava的5个鲜为人知的特性的更多相关文章
- 使用 Google Guava 美化你的 Java 代码
文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMP ...
- (翻译)Google Guava Cache
翻译自Google Guava Cache This Post is a continuation of my series on Google Guava, this time covering G ...
- Guava 教程2-深入探索 Google Guava 库
原文出处: oschina 在这个系列的第一部分里,我简单的介绍了非常优秀的Google collections和Guava类库,并简要的解释了作为Java程序员,如果使用Guava库来减少项目中大量 ...
- Google Guava入门(一)
Guava作为Java编程的助手,可以提升开发效率,对Guava设计思想的学习则极大的有益于今后的编程之路.故在此对<Getting Started with Google Guava>一 ...
- [Google Guava] 11-事件总线
原文链接 译文连接 译者:沈义扬 传统上,Java的进程内事件分发都是通过发布者和订阅者之间的显式注册实现的.设计EventBus就是为了取代这种显示注册方式,使组件间有了更好的解耦.EventBus ...
- [Google Guava] 6-字符串处理:分割,连接,填充
原文链接 译文链接 译者:沈义扬,校对:丁一 连接器[Joiner] 用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦.如果字符串序列中含有null,那连接操作会更难.Fluent风格的Joine ...
- [Google Guava] 3-缓存
原文地址 译文地址 译者:许巧辉 校对:沈义扬 范例 01 LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() ...
- [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...
- java开发人员,最应该学习和熟练使用的工具类。google guava.(谷歌 瓜娃)
学习参考文章: http://blog.csdn.net/wisgood/article/details/13297535 http://ifeve.com/google-guava/ http:// ...
随机推荐
- glusterfs 4.0.1 event模块 分析笔记1
1. 前言 在C语言i中,存储变量的结构体加上一组函数指针,大概就可以算是一个对象模型了:如果将一组函数指针捆绑为结构体, 后期根据配置或者环境需要绑定到不同实现模块中的一组函数,可以认为是C语言面对 ...
- mvn package 和 mvn install
刚刚准备将maven项目中一个子项目打个包,使用了mvn package.心想这个很简单嘛,没料就报错了.报错咱不怕,看看错在哪就好了. 编译出错,找不到我定义的异常类中的配置.那应该是引用父模块出来 ...
- Java JS SHA-256加密
http://www.cnblogs.com/elaron/archive/2013/04/09/3010375.html js部分: <html> <head></he ...
- c# 判断datatable中是否存在某列
if (datatable.columns.contains("要找的列名"))
- ignorable tips
枚举 索引从0开始 sort 默认升序排列 Array.Sort(intSort); //复制数组 Array.Copy(intSort,intNew,3); intsort 源数组 intnew ...
- 47. Permutations II(medium, backtrack, 重要, 条件较难思考)
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- phpstorm查看类的继承关系
在看一些框架源码时,有些类有很多的继承或者接口,有一款神奇的帮助很重要 选中一个类文件,右键,选择diagrams->show diagrams 即可得到类的继承关系,如上右图 使用函数 fun ...
- Jupyter Notebook 快速入门
Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言.在本文中,我们将介绍 Jupyter notebook 的主要特性,以 ...
- CentOS, Fedora, or Red Hat一行命令安装apache + mysql + php 及各种依赖库
sudo sh -c "yum install httpd httpd-devel mysql mysql-server mysql-devel php php-mysql php-comm ...
- WebRTC 音频算法 附完整C代码
WebRTC提供一套音频处理引擎, 包含以下算法: AGC自动增益控制(Automatic Gain Control) ANS噪音抑制(Automatic Noise Suppression) AEC ...