以下资料整理自网络

一、Google Guava入门介绍

引言

Guavaproject包括了若干被Google的 Java项目广泛依赖 的核心库,比如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 全部这些工具每天都在被Google的project师应用在产品服务中。

查阅Javadoc并不一定是学习这些库最有效的方式。在此,我们希望通过此文档为Guava中最流行和最强大的功能。提供更具可读性和解释性的说明。

译文格式说明

  • Guava中的类被首次引用时,都会链接到Guava的API文档。如:Optional<T>
  • Guava和JDK中的方法被引用时。一般都会链接到Guava或JDK的API文档,一些人所共知的JDK方法除外。如:Optional.of(T),
    Map.get(key)。

  • 译者对文档的额外说明以斜体显示,而且以“译者注:”開始。

文件夹

1. 基本工具 [Basic utilities]

让使用Java语言变得更舒适

1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误。有些时候它让人非常不舒服。

非常多Guava工具类用高速失败拒绝null值,而不是盲目地接受

1.2 前置条件: 让方法中的条件检查更简单

1.3 常见Object方法: 简化Object方法实现。如hashCode()和toString()

1.4 排序: Guava强大的”流畅风格比較器”

1.5 Throwables:简化了异常和错误的传播与检查

2. 集合[Collections]

Guava对JDK集合的扩展,这是Guava最成熟和为人所知的部分

2.1 不可变集合: 用不变的集合进行防御性编程和性能提升。

2.2 新集合类型: multisets, multimaps, tables, bidirectional maps等

2.3 强大的集合工具类: 提供java.util.Collections中没有的集合工具

2.4 扩展工具类:让实现和扩展集合类变得更easy。比方创建Collection的装饰器,或实现迭代器

3. 缓存[Caches]

Guava Cache:本地缓存实现,支持多种缓存过期策略

4. 函数式风格[Functional idioms]

Guava的函数式支持能够显著简化代码。但请慎重使用它

5. 并发[Concurrency]

强大而简单的抽象,让编写正确的并发代码更简单

5.1 ListenableFuture:完毕后触发回调的Future

5.2 Service框架:抽象可开启和关闭的服务,帮助你维护服务的状态逻辑

6. 字符串处理[Strings]

非常实用的字符串工具。包括切割、连接、填充等操作

7. 原生类型[Primitives]

扩展 JDK 未提供的原生类型(如int、char)操作, 包括某些类型的无符号形式

8. 区间[Ranges]

可比較类型的区间API。包括连续和离散类型

9. I/O

简化I/O尤其是I/O流和文件的操作,针对Java5和6版本号

10. 散列[Hash]

提供比Object.hashCode()更复杂的散列实现。并提供布鲁姆过滤器的实现

11. 事件总线[EventBus]

公布-订阅模式的组件通信,但组件不须要显式地注冊到其它组件中

12. 数学运算[Math]

优化的、充分測试的数学工具类

13. 反射[Reflection]

Guava 的 Java 反射机制工具类

     中文參考站点:http://ifeve.com/google-guava/

二、Guava学习笔记:Preconditions优雅的检验參数

  在日常开发中。我们常常会对方法的输入參数做一些数据格式上的验证,以便保证方法能够依照正常流程运行下去。对于可预知的一些数据上的错误。我们一定要做事前检測和推断,来避免程序流程出错,而不是全然通过错误处理来保证流程正确运行,毕竟错误处理是比較消耗资源的方式。

在寻常情况下我们对參数的推断都须要自己来逐个写方法推断,代码量不少而且复用性不高,例如以下所看到的:

import org.junit.Test;

public class PreconditionsTest {

    @Test
public void Preconditions() throws Exception { getPerson(8,"peida"); getPerson(-9,"peida"); getPerson(8,""); getPerson(8,null);
}
public static void getPerson(int age,String neme)throws Exception{
if(age>0&&neme!=null&&neme.isEmpty()!=true){
System.out.println("a person age:"+age+",neme:"+neme);
}else{
System.out.println("參数输入有误。");
}
}
}

  说明:參数验证。我们每次都要加入if语句来做推断, 反复的工作会做好多次。getPerson方法仅仅有2个參数。验证规则也不是非常复杂,假设參数过度,验证规则复杂后,上面代码的可读性都会非常差的,复用性就更谈不上了。

  Guava类库中提供了一个作參数检查的工具类--Preconditions类, 该类能够大大地简化我们代码中对于參数的预推断和处理。让我们对方法输入參数的验证实现起来更加简单优雅。以下我们看看Preconditions类的使用实例:

Preconditions里面的方法:

  1 .checkArgument(boolean) :
  功能描写叙述:检查boolean是否为真。 用作方法中检查參数
  失败时抛出的异常类型: IllegalArgumentException

  2.checkNotNull(T):     
  功能描写叙述:检查value不为null, 直接返回value;
  失败时抛出的异常类型:NullPointerException

  3.checkState(boolean):
  功能描写叙述:检查对象的一些状态。不依赖方法參数。 比如, Iterator能够用来next是否在remove之前被调用。
  失败时抛出的异常类型:IllegalStateException

  4.checkElementIndex(int index, int size):
  功能描写叙述:检查index是否为在一个长度为size的list, string或array合法的范围。 index的范围区间是[0, size)(包括0不包括size)。

无需直接传入list, string或array, 仅仅需传入大小。返回index。  

  失败时抛出的异常类型:IndexOutOfBoundsException

  5.checkPositionIndex(int index, int size):
  功能描写叙述:检查位置index是否为在一个长度为size的list。 string或array合法的范围。 index的范围区间是[0, size)(包括0不包括size)。无需直接传入list。 string或array, 仅仅需传入大小。返回index。

  失败时抛出的异常类型:IndexOutOfBoundsException

  6.checkPositionIndexes(int start, int end, int size):
  功能描写叙述:检查[start, end)是一个长度为size的list。 string或array合法的范围子集。

伴随着错误信息。

  失败时抛出的异常类型:IndexOutOfBoundsException

  一个比較实用实例:

import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.google.common.base.Preconditions; public class PreconditionsTest { @Test
public void Preconditions() throws Exception { getPersonByPrecondition(8,"peida"); try {
getPersonByPrecondition(-9,"peida");
} catch (Exception e) {
System.out.println(e.getMessage());
} try {
getPersonByPrecondition(8,"");
} catch (Exception e) {
System.out.println(e.getMessage());
} try {
getPersonByPrecondition(8,null);
} catch (Exception e) {
System.out.println(e.getMessage());
} List<Integer> intList=new ArrayList<Integer> ();
for(int i=0;i<10;i++){
try {
checkState(intList,9);
intList.add(i);
} catch (Exception e) {
System.out.println(e.getMessage());
} } try {
checkPositionIndex(intList,3);
} catch (Exception e) {
System.out.println(e.getMessage());
} try {
checkPositionIndex(intList,13);
} catch (Exception e) {
System.out.println(e.getMessage());
} try {
checkPositionIndexes(intList,3,7);
} catch (Exception e) {
System.out.println(e.getMessage());
} try {
checkPositionIndexes(intList,3,17);
} catch (Exception e) {
System.out.println(e.getMessage());
} try {
checkPositionIndexes(intList,13,17);
} catch (Exception e) {
System.out.println(e.getMessage());
} try {
checkElementIndex(intList,6);
} catch (Exception e) {
System.out.println(e.getMessage());
} try {
checkElementIndex(intList,16);
} catch (Exception e) {
System.out.println(e.getMessage());
}
} public static void getPersonByPrecondition(int age,String neme)throws Exception{
Preconditions.checkNotNull(neme, "neme为null");
Preconditions.checkArgument(neme.length()>0, "neme为\'\'");
Preconditions.checkArgument(age>0, "age 必须大于0");
System.out.println("a person age:"+age+",neme:"+neme); } public static void checkState(List<Integer> intList,int index)throws Exception{
//表达式为true不抛异常
Preconditions.checkState(intList.size()<index, " intList size 不能大于"+index);
} public static void checkPositionIndex(List<Integer> intList,int index) throws Exception{
Preconditions.checkPositionIndex(index, intList.size(), "index "+index+" 不在 list中。 List size为:"+intList.size());
} public static void checkPositionIndexes(List<Integer> intList,int start,int end) throws Exception{
Preconditions.checkPositionIndexes(start, end, intList.size());
} public static void checkElementIndex(List<Integer> intList,int index) throws Exception{
Preconditions.checkElementIndex(index, intList.size(),"index 为 "+index+" 不在 list中, List size为: "+intList.size());
}
}

  输出结果:

a person age:8,neme:peida
age 必须大于0
neme为''
neme为null
intList size 不能大于9
index 13 不在 list中, List size为:9 (13) must not be greater than size (9)
end index (17) must not be greater than size (9)
start index (13) must not be greater than size (9)
index 为 16 不在 list中, List size为: 9 (16) must be less than size (9)

 

  Guava的preconditions有这样几个长处:

  在静态导入后, 方法非常明白无歧义, checkNotNull能够清楚地告诉你它是干什么的, 它会抛出如何的异常.
  checkNotNull在验证通过后直接返回, 能够这样方便地写代码: this.field = checkNotNull(field).
      简单而又强大的可变參数'printf'风格的自己定义错误信息.

參考文章:http://www.cnblogs.com/peida/archive/2013/06/17/Guava_Preconditions.html

Google Guava新手教程的更多相关文章

  1. [转]Google Guava官方教程(中文版)

    Google Guava官方教程(中文版) http://ifeve.com/google-guava/

  2. Google Guava官方教程(中文版)

    Google Guava官方教程(中文版) 原文链接  译文链接 译者: 沈义扬,罗立树,何一昕,武祖  校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库, ...

  3. Google Guava官方教程(中文版)地址

    Google Guava官方教程(中文版) http://ifeve.com/google-guava/ 瓜娃啊瓜娃

  4. Google Guava入门教程

    以下资料整理自网络 一.Google Guava入门介绍 引言 Guava 工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [cachi ...

  5. [转载]Google Guava官方教程(中文版)

      原文链接  译文链接 译者: 沈义扬,罗立树,何一昕,武祖  校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] ...

  6. com.google.guava 包解析 ——Google Guava官方教程(中文版)

    全网址           http://ifeve.com/google-guava/ 竹子博客:  http://www.cnblogs.com/peida/archive/2013/06/08/ ...

  7. Google Guava官方教程

    原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,*武祖 * 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] . ...

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

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

  9. 【OpenCV新手教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...

随机推荐

  1. Codeforces Round #369 (Div. 2) D. Directed Roads 数学

    D. Directed Roads 题目连接: http://www.codeforces.com/contest/711/problem/D Description ZS the Coder and ...

  2. 【原】Spring整合Redis(第一篇)—SDR简述

    1.SDR说明 Spring Data Redis(SDR),是SpringFramework提供的一套简化访问Redis的API,是对Jedis的又一层封装. SDR集成了Jedis,JRedis, ...

  3. Mysql_解决The total number of locks exceeds the lock table size错误

    在操作mysql数据库表时出现以下错误. 网上google搜索相关问题,发现一位外国牛人这么解释: If you're running an operation on a large number o ...

  4. 通过Windows Compatibility Pack补充.net core中缺失的api

    把项目往.net core上迁移的时候,一个最大的问题就是和.net framework相比,有一部分api缺失.它主要分为两类: Windows 独有的api,如注册表 未完成的功能,如System ...

  5. 用SWD调试接口测量代码运行时间 ( SWO )

    用SWD调试接口测量代码运行时间 关于时间测量的种种问题 在嵌入式中,我们经常需要测量某段代码的执行时间或测量事件触发的时间,常规的思路是: 1:在测量起始点,反转电平2:在测量结束点,再次反转电平 ...

  6. oracle sql 高级

    1  时间   如果是从当前时间到前一个月的这个时候之间的记录总条数:   select count(1)   from uis_md_stcustom u  where firsttime betw ...

  7. 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...

  8. Revit API画垂直于风管的风管

    start /// <summary> /// 选择风管与风管外一点,画与风管垂直的风管. /// </summary> [Transaction(TransactionMod ...

  9. Excel部署配置DCOM

    对 Excel进行编程,实际上就是通过 .Net Framework去调用 Excel的 COM组件,所有要在 Web环境下调用 COM组件的时候,都需要对其进行相应的配置. 很多朋友都反映在 Win ...

  10. Linux init 0-6 启动级别

    原文地址:http://blog.sina.com.cn/s/blog_5f8e8d9801010wlr.html 原文地址:[转]Linux init 0-6 启动级别作者:流水清风 init 0- ...