Guava 基本介绍及常用的基本用法

2017-03-16 22:26:00   最后更新: 2017-03-16 22:26:00   访问数量:198




guava 是一套由 google 开发的十分成熟、易用 java 核心库,包含了集合、缓存、并发库、原生类型支持、通用注解、字符串处理、IO 操作等基础库

由于 Guava 的强大与易用,被 java 开发人员广泛接受,jdk 的每次升级都会融入 Guava 中一些已经被广泛验证并且运用的特性,足见 Guava 的先进

本篇日志就来介绍一下常见的几个 Guava 基本工具

 

有过 java 编程经验的很多人都有过和 null 开战的悲惨经历,模棱两可的 null 常常会导致很多令人意想不到的问题

java8 中也加入了 Optional 类:

java8 新特性

Guava 用 Optional 类解决了这个问题,Optional<T> 对 T 类型进行了一层封装,可以看做是 T 类型的一个容器,他 提供了下列方法:

 

Optional 提供的 static 方法

Optional 提供的 static 方法
方法说明
Optional.of(T)创建指定引用的Optional实例,若引用为null则快速失败
Optional.absent()创建引用缺失的Optional实例
Optional.fromNullable(T)创建指定引用的Optional实例,若引用为null则表示缺失

Guava 提供了上述三个 static 方法用来创建和初始化 Optional

 

Optional 的成员方法

Optional 提供的成员方法
方法说明
boolean isPresent()如果Optional包含非null的引用(引用存在),返回true
T get()返回Optional所包含的引用,若引用缺失,则抛出java.lang.IllegalStateException
T or(T)返回Optional所包含的引用,若引用缺失,返回指定的值
T orNull()返回Optional所包含的引用,若引用缺失,返回null
Set asSet()返回Optional所包含引用的单例不可变集,如果引用存在,返回一个只有单一元素的集合,如果引用缺失,返回一个空集合。

 

说明

Optional 赋予了 null 语义,强迫使用者对引用缺失的情况进行思考

最基本的用法是:

Optional<TestClass> testObj = Optional.of(obj); if (testObj.isPresent()) { return testObj.get().actMethod(); } else { throw new Exception("testObj is null"); }

 

但这样做和下面的方式又有什么区别呢?

if (obj == null) { return obj.actMethod(); } else { throw new Exception("testObj is null"); }

 

 

这样做是看不出 Optional 究竟有什么值得我们称道的地方的,下面的方式则显出了 Optional 的存在价值:

objList.add(objOptional.or(new Obj()));

 

 

在我们的方法开始执行时,我们通常需要去检查参数的合法性,而不是让非法数据污染我们的业务流程

Guava 提供了一个 Preconditions 对象,封装了一系列 static 方法,用抛出异常的方式来让错误的参数快速失败

Guava Preconditions 对象提供的前置条件检查静态方法
方法描述失败时抛出的异常类型
checkArgument(boolean)检查boolean是否为true,用来检查传递给方法的参数。IllegalArgumentException
checkNotNull(T)检查value是否为null,该方法直接返回value,因此可以内嵌使用checkNotNull。NullPointerException
checkState(boolean)用来检查对象的某些状态。IllegalStateException
checkElementIndex(int index, int size)检查index作为索引值对某个列表、字符串或数组是否有效。index>=0 && indexIndexOutOfBoundsException
checkPositionIndex(int index, int size)检查index作为位置值对某个列表、字符串或数组是否有效。index>=0 && index<=size *IndexOutOfBoundsException
checkPositionIndexes(int start, int end, int size)检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效*IndexOutOfBoundsException

 

equals -- equal

java 中,我们常常需要使用 equals 方法比较两个对象,但是在此之前,我们首先需要判断其中一个对象是否为 null,否则就会抛出 NullPointException

Guava 提供 Objects.equals 方法解决了这个问题:

Objects.equal("a", "a"); // returns true Objects.equal(null, "a"); // returns false Objects.equal("a", null); // returns false Objects.equal(null, null); // returns true

 

 

hashCode

如果我们的某个类希望作为 Map 的 key,那么他就必须要具有 hashCode 方法,如何设计出合理的、顺序敏感的散列值,这是一个比较难的事情,Guava 提供了 Objects.hashCode 方法,通过传入若干 field 实现科学合理的散列值的生成

JDK7 的 Objects 类也提供了一样的 hashCode 方法,用来实现这个功能

 

toString -- toStringHelper

有了 hashCode 方法,toString 方法也是我们常常需要的,Guava 提供的 Objects.toStringHelper 方法可以帮助我们轻松实现 toString 方法

// Returns "ClassName{x=1}" Objects.toStringHelper(this).add("x", 1).toString(); // Returns "MyObject{x=1}" Objects.toStringHelper("MyObject").add("x", 1).toString();

 

 

compare/compareTo -- ComparisonChain

如果我们希望创建一个 Comparable,一个可以比较的对象,那么我们就需要实现 Comparable<T> 接口,然后我们需要实现 compareTo 方法,看上去好像并不复杂,但是通常我们并不仅仅需要比较对象的一个成员,而是分优先级顺次比较多个成员:

class TestCompare implements Comparable<TestCompare> { private MyObject first; private MyObject second; private MyObject third; @Override public int compareTo(TestCompare t) { int cmp = first.compareTo(t.first); cmp = cmp == 0 ? second.compareTo(t.second) : cmp; cmp = cmp == 0 ? third.compareTo(t.third) : cmp; return cmp; } }

 

 

这样是很琐碎且可读性很差的,Guava 提供了 ComparisonChain 类用来实现这一系列操作:

class TestCompare implements Comparable<TestCompare> { private MyObject first; private MyObject second; private MyObject third; @Override public int compareTo(TestCompare t) { return ComparisonChain.start() .compare(this.first, that.first) .compare(this.second, that.second) .compare(this.third, that.third) .result(); } } 这样看上去是不是优雅多了呢?

 

 

guava 官方教程 -- https://github.com/google/guava/wiki

 






技术帖      技术分享      java      object      google      null      guava     


京ICP备15018585号