Guava教程(一)
guava说明
guava是Google开源的一个针对java语言的一个工具库,其中包含了null的处理,简化Throwable异常,集合,缓存,函数式编程,并发,I/O,字符串处理,区间,事件总线,原生类型,数学运算,反射等相关的封装处理。
Optional:使用和避免 null
大多数情况下,开发人员使用 null 表明的是某种缺失情形:可能是已经有一个默认值,或没有值,或找不到值。例如Map.get 返回 null 就表示找不到给定键对应的值。Guava用Optional表示可能为 null 的 T 类型引用。一个Optional实例可能包含非 null 的引用(我们称之为引用存在),也可能什么也不包括(称之为引用缺失)。它从不说包含的是null值,而是用存在或缺失来表示。但 Optional 从不会包含null值引用。Optional用于包含非空对象得不可变对象。这个类有各种实用的方法,以方便代码来处理为可用或不可用,而不是检查null值。
举例一:
控制台输出:
Exception in thread "main" java.lang.NullPointerException at com.fire.guavaone.TestOne.sum(TestOne.java:15) at com.fire.guavaone.TestOne.main(TestOne.java:10)
代码是在运行求和的时候抛出空指针异常。
控制台输出:
Exception in thread "main" java.lang.NullPointerException at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:871) at com.google.common.base.Optional.of(Optional.java:105) at com.fire.guavaone.TestOne.main(TestOne.java:9)
代码是在运行调用Optional.of()的时候抛出空指针异常
上述的例子就是Java在用一般的写法的时候和使用guava库的时候对空
指针的处理,guava就是在程序调用的时候对数据进行了判空操作,避免了在做业务处理的时候抛出异常。其实Optional还有一系列的操作方法,
此处只是用了一个Optional.of()方法引入guava这个库。
创建Optional实例的方法(以下都是静态方法):
方法 | 说明 |
---|---|
Optional.of(T) | 创建指定引用的 Optional 实例,若引用为 null 则快速失败 |
Optional.absent() | 创建引用缺失的 Optional 实例,其内部包含了空值 |
Optional.fromNullable(T) | 创建指定引用的 Optional 实例,若引用为 null 则表示缺失 |
前面已经说明了Optional.of()方法的使用,下面再来说明另外两个方法的使用。
举例二:
控制台输出:(注意:optional.isPresent()
是判断指定引用是否非空的一个方法)
null
举例三:
控制台输出:
not null
用 Optional 实例查询引用(以下都是非静态方法):
方法 | 说明 |
---|---|
boolean isPresent() | 如果 Optional 包含非 null 的引用(引用存在),返回true |
T get() | 返回 Optional 所包含的引用,若引用缺失,则抛出 java.lang.IllegalStateException |
T or(T) | 返回 Optional 所包含的引用,若引用缺失,返回指定的值 |
T T orNull() | 返回 Optional 所包含的引用,若引用缺失,返回 null |
SetasSet() | 返回 Optional 所包含引用的单例不可变集,如果引用存在,返回一个只有单一元素的集合,如果引用缺失,返回一个空集合。 |
上述的就是optional实例查询的方法,使用都比较简单,获取optional实例过后,直接调用相应的方法。
Optional的意义:
使用Optional除了赋予null语义,增加了可读性,最大的有点在于它是一种
傻瓜式的防护。Optional迫使你积极的思考引用缺失的情况,因为你必须显式地从 Optional 获取引用。直接使用 null 很容易让人忘掉某些情形,尽管 FindBugs 可以帮助查找 null 相关的问题,但是我们还是认为它并不能
准确地定位问题根源。例如:当你需要用一个默认值来替换可能的null,。Optional 也是一个比较好的替代方,Optional.of(first).or(second)。
Preconditions:前置条件
Preconditions提供静态方法来检查方法或构造函数,被调用是否给定适当的参数。它检查的先决条件。其方法失败抛出IllegalArgumentException。
Preconditions的方法列举:(注意:表中每个方法都有三个变种,分别有一个参数,两个参数,三个参数的重载方法,有两个参数方法里的第二个参数为errormessage,有三个参数的方法离的第二个参数为errormessage,第三个参数为你需要拼接的数据)
方法 | 说明 | 检查失败时抛出的异常 |
---|---|---|
checkArgument(boolean) | 检查 boolean 是否为 true,用来检查传递给方法的参数。 | IllegalArgumentException |
checkNotNull(T) | 检查 value 是否为 null,该方法直接返回 value,因此可以内嵌使用 checkNotNull? | NullPointerException |
checkState(boolean) | 用来检查对象的某些状态。 | IllegalStateException |
checkElementIndex(int index, int size) | 检查 index 作为索引值对某个列表、字符串或数组是否有效。index>=0 && index<size * | IndexOutOfBoundsException |
checkPositionIndex(int index, int size) | 检查 index 作为位置值对某个列表、字符串或数组是否有效。index>=0 && index<=size * | IndexOutOfBoundsException |
checkPositionIndexes(int start, int end, int size) | 检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效* | IndexOutOfBoundsException |
文字写得再多,再优美,还不如来一个例子更能表达用途一点。
举例一:检测一个浮点型数据是否大于0.0
控制台输出:
Illegal Argument passed: Negative value 0.0.
举例二:两个Integer数据求和之前先判断两个实例是否为空,为空则抛出异常
控制台输出:
Exception in thread "main" java.lang.NullPointerException: Illegal Argument passed: Second parameter is Null. at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:889) at com.fire.guavaone.TestOne.sum(TestOne.java:17) at com.fire.guavaone.TestOne.main(TestOne.java:9)
举例三:通过传入一个数组的下标获取,获取该数组该下标处的值,如果传入的数字大于数组的长度则抛出下标越界异常
控制台输出:
Illegal Argument passed: Invalid index. (5) must be less than size (5)
同理其他的方法也是如此调用。
Preconditions常用的地方:
索引值常用来查找列表,字符串或者数组中的元素,如List.get(int), String.charAt(int);
位置值和位置范围常用来截取列表、字符串或数组,如 List.subList(int,int), String.substring(int);
checkNotNull 直接返回检查的参数,让你可以在构造函数中保持字段的单行赋值风格:this.field = checkNotNull(field);
限制取值的范围等等。
要使用Maven添加对Guava的依赖,请使用以下内容:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.5-jre</version> <!-- or, for Android: --> <version>23.5-android</version> </dependency>
使用Gradle添加依赖项:
dependencies { compile 'com.google.guava:guava:23.5-jre' // or, for Android: compile 'com.google.guava:guava:23.5-android' }
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved