Guava 基本介绍及常用的基本用法
2017-03-16 22:26:00 最后更新: 2017-03-16 22:26:00 访问数量:1681
2017-03-16 22:26:00 最后更新: 2017-03-16 22:26:00 访问数量:1681
guava 是一套由 google 开发的十分成熟、易用 java 核心库,包含了集合、缓存、并发库、原生类型支持、通用注解、字符串处理、IO 操作等基础库
由于 Guava 的强大与易用,被 java 开发人员广泛接受,jdk 的每次升级都会融入 Guava 中一些已经被广泛验证并且运用的特性,足见 Guava 的先进
本篇日志就来介绍一下常见的几个 Guava 基本工具
有过 java 编程经验的很多人都有过和 null 开战的悲惨经历,模棱两可的 null 常常会导致很多令人意想不到的问题
java8 中也加入了 Optional 类:
Guava 用 Optional 类解决了这个问题,Optional<T> 对 T 类型进行了一层封装,可以看做是 T 类型的一个容器,他 提供了下列方法:
方法 | 说明 |
Optional.of(T) | 创建指定引用的Optional实例,若引用为null则快速失败 |
Optional.absent() | 创建引用缺失的Optional实例 |
Optional.fromNullable(T) | 创建指定引用的Optional实例,若引用为null则表示缺失 |
Guava 提供了上述三个 static 方法用来创建和初始化 Optional
方法 | 说明 |
boolean isPresent() | 如果Optional包含非null的引用(引用存在),返回true |
T get() | 返回Optional所包含的引用,若引用缺失,则抛出java.lang.IllegalStateException |
T or(T) | 返回Optional所包含的引用,若引用缺失,返回指定的值 |
T orNull() | 返回Optional所包含的引用,若引用缺失,返回null |
Set | 返回Optional所包含引用的单例不可变集,如果引用存在,返回一个只有单一元素的集合,如果引用缺失,返回一个空集合。 |
Optional 赋予了 null 语义,强迫使用者对引用缺失的情况进行思考
最基本的用法是:
但这样做和下面的方式又有什么区别呢?
这样做是看不出 Optional 究竟有什么值得我们称道的地方的,下面的方式则显出了 Optional 的存在价值:
在我们的方法开始执行时,我们通常需要去检查参数的合法性,而不是让非法数据污染我们的业务流程
Guava 提供了一个 Preconditions 对象,封装了一系列 static 方法,用抛出异常的方式来让错误的参数快速失败
方法 | 描述 | 失败时抛出的异常类型 |
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 |
java 中,我们常常需要使用 equals 方法比较两个对象,但是在此之前,我们首先需要判断其中一个对象是否为 null,否则就会抛出 NullPointException
Guava 提供 Objects.equals 方法解决了这个问题:
如果我们的某个类希望作为 Map 的 key,那么他就必须要具有 hashCode 方法,如何设计出合理的、顺序敏感的散列值,这是一个比较难的事情,Guava 提供了 Objects.hashCode 方法,通过传入若干 field 实现科学合理的散列值的生成
JDK7 的 Objects 类也提供了一样的 hashCode 方法,用来实现这个功能
有了 hashCode 方法,toString 方法也是我们常常需要的,Guava 提供的 Objects.toStringHelper 方法可以帮助我们轻松实现 toString 方法
如果我们希望创建一个 Comparable,一个可以比较的对象,那么我们就需要实现 Comparable<T> 接口,然后我们需要实现 compareTo 方法,看上去好像并不复杂,但是通常我们并不仅仅需要比较对象的一个成员,而是分优先级顺次比较多个成员:
这样是很琐碎且可读性很差的,Guava 提供了 ComparisonChain 类用来实现这一系列操作:
guava 官方教程 -- https://github.com/google/guava/wiki