译文出处: 花名有孚   原文出处: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. python2.7练习小例子(一)

        1)题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少?     程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去掉不满足条件的 ...

  2. 【docker简易笔记】docker基础信息的分享

    docker 使用的频率越来越高,所以在后续的一些博客中会分享一些docker的安装和使用. 一.docker介绍   "Docker 最初是 dotCloud 公司创始人 Solomon ...

  3. 开发网页时,127.0.0.1或者localhost能访问,而本机地址不能访问的解决

    第一 ping试试 127.0.0.1 和 本机地址 若127.0.0.1可以 说明可以自己ping自己 若本机地址可以 说明host正常 第二 检查服务器部署 再部署一个新的 若新的正常 说明你项目 ...

  4. Servlet技术 Cookie与Session

    会话过程:用户打开浏览器,点击链接访问资源,最后到关闭浏览器的整个过程称之为会话. 会话使用:与服务器进行会话的过程中产生数据,数据被保存下来,服务器根据数据对客户进行辨别,做出个性化的响应. 介绍两 ...

  5. 深入理解Java类加载器(1):Java类加载原理解析

    1 基本信息 每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...

  6. webpack 前后端分离开发接口调试解决方案,proxyTable解决方案

    如果你有单独的后端开发服务器 API,并且希望在同域名下发送 API 请求 ,那么代理某些 URL 会很有用. dev-server 使用了非常强大的 http-proxy-middleware 包. ...

  7. linux下内存大小、起始地址的解析与修改

    在实际的工作中,由于产品型号的不同,经常需要调整linux所管理的内存的大小,而内核在启动阶段,会两次去解析从uboot传递过来的关于内存的信息,具体如下: 一.解析从uboot传递过来的tag(在p ...

  8. 浅析深度学习mini_batch的BP反传算法

    在深度学习中,如果我们已经定义了网络,输入,以及输出,那么接下来就是损失函数,优化策略,以及一般由框架完成的BP反传.这篇博文我们主要探讨一下深度的BP反传算法(以梯度下降为例),尤其是mini_ba ...

  9. Android support library支持包常用控件介绍(一)

    谷歌官方推出Material Design 设计理念已经有段时间了,为支持更方便的实现Material Design设计效果,官方给出了Android support design library 支 ...

  10. Android图表库MPAndroidChart(四)——条形图的绘制过程过程,隐隐约约我看到了套路

    Android图表库MPAndroidChart(四)--条形图的绘制过程过程,隐隐约约我看到了套路 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库 ...