Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。
本文使用的Guava版本如下:
com.google.guava
guava
25.1-jre
当一个对象中的字段可以为null时,实现Object.equals方法会很痛苦,因为不得不分别对它们进行null检查。使用Objects.equal帮助你执行null敏感的equals判断,从而避免抛出NullPointerException。例如:
/**
* @param
* @return void
* @Title:
* @methodName: ObjectsTest
* @Description:
* @author: FLY
* @date: 2018-06-23 7:36
*/
public static void ObjectsTest() {
System.out.println(Objects.equal("a", "a")); // returns true
System.out.println(Objects.equal(null, "a")); // returns false
System.out.println(Objects.equal("a", null)); // returns false
System.out.println(Objects.equal(null, null)); // returns true
}
Guava的Optional类似于Java 8新增的Optional类,都是用来处理null的。
Guava用Optional表示可能为null的T类型引用。一个Optional实例可能包含非null的引用(我们称之为引用存在),也可能什么也不包括(称之为引用缺失)。它从不说包含的是null值,而是用存在或缺失来表示。但Optional从不会包含null值引用。
/**
* @param
* @return void
* @Title:
* @methodName: OptionalTest
* @Description:
* @author: FLY
* @date: 2018-06-23 7:44
*/
public static void OptionalTest() {
Integer value1 = null;
Integer value2 = 10;
/**
* 创建指定引用的Optional实例,若引用为null则表示缺失
*/
Optional a = Optional.fromNullable(value1);
Optional c = Optional.fromNullable(value2);
/**
* 创建指定引用的Optional实例,若引用为null则快速失败
*/
// Optional b = Optional.of(value1); // java.lang.NullPointerException
Optional d = Optional.of(value2);
//isPresent():如果Optional包含非null的引用(引用存在),返回true
System.out.println("a: " + a.isPresent()); // a: false
System.out.println("c: " + c.isPresent()); // c: true
System.out.println("d: " + d.isPresent());// d: true
Integer value3 = a.or(0); //返回Optional所包含的引用,若引用缺失,返回指定的值
Integer value4 = d.get(); //返回所包含的实例,它必须存在,通常在调用该方法时会调用isPresent()判断是否为null
Integer value5 = value3 + value4;
System.out.println(value5); // 10
}
前置条件Preconditions提供静态方法来检查方法或构造函数,被调用是否给定适当的参数。它检查的先决条件。其方法失败抛出IllegalArgumentException。
/**
* @Title:
* @methodName: sumPreconditions
* @param a
* @param b
* @return int
* @Description:
*
* @author: FLY
* @date: 2018-06-26 6:39
*/
public static int sumPreconditions(Integer a,Integer b){
a=Preconditions.checkNotNull(a,
"Illegal Argument passed: First parameter is Null.");
b=Preconditions.checkNotNull(b,
"Illegal Argument passed: First parameter is Null.");
return a+b;
}
public static void main(String[] args) {
try {
sumPreconditions(4,null);
} catch (NullPointerException e){
System.out.println("【异常了】"+ e.getMessage());
// 【异常了】Illegal Argument passed: First parameter is Null.
}
}
/**
* @param
* @return void
* @Title: 连接器[Joiner]
* @methodName: JoinerTest
* @Description:
* @author: FLY
* @date: 2018-06-23 7:44
*/
public static void JoinerTest() {
/*
on:制定拼接符号,如:test1-test2-test3 中的 “-“ 符号
skipNulls():忽略NULL,返回一个新的Joiner实例
useForNull(“Hello”):NULL的地方都用字符串”Hello”来代替
*/
StringBuilder sb = new StringBuilder();
Joiner.on(",").skipNulls().appendTo(sb, "Hello", "Guava");
System.out.println("【on:制定拼接符号】:" + sb); // 【on:制定拼接符号】:Hello,Guava
System.out.println(Joiner.on(",").useForNull("none").join(1, null, 3));// 1,none,3
System.out.println(Joiner.on(",").skipNulls().join(Arrays.asList(1, 2, 3, 4, null, 6)));// 1,2,3,4,6
Map map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
System.out.println(Joiner.on("&").withKeyValueSeparator("=").join(map)); // key1=value1&key2=value2&key3=value3
}
JDK内建的字符串拆分工具有一些古怪的特性。比如,String.split悄悄丢弃了尾部的分隔符。 问题:”,a,,b,”.split(“,”)返回?
/**
* @param
* @return void
* @Title: 拆分器[Splitter]
* @methodName: SplitterTest
* @Description:
* @author: FLY
* @date: 2018-06-25 6:00
*/
public static void SplitterTest() {
// JDK内建的字符串拆分工具有一些古怪的特性。比如,String.split悄悄丢弃了尾部的分隔符
String[] split = ",a,,b,".split(",");
System.out.println(Arrays.toString(split)); // [, a, , b]
Iterable splitter = Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split("the ,quick, , brown , fox, jumps, over, the, lazy, little dog.");
System.out.println(splitter);// [the, quick, brown, fox, jumps, over, the, lazy, little dog.]
}
方法 | 描述 | 范例 |
Splitter.on(char) | 按单个字符拆分 | Splitter.on(‘;’) |
Splitter.on(CharMatcher) | 按字符匹配器拆分 | Splitter.on(CharMatcher.BREAKING_WHITESPACE) |
Splitter.on(String) | 按字符串拆分 | Splitter.on(“, “) |
Splitter.on(Pattern)Splitter.onPattern(String) | 按正则表达式拆分 | Splitter.onPattern(“\r?\n”) |
Splitter.fixedLength(int) | 按固定长度拆分;最后一段可能比给定长度短,但不会为空。 | Splitter.fixedLength(3) |
方法 | 描述 |
omitEmptyStrings() | 从结果中自动忽略空字符串 |
trimResults() | 移除结果字符串的前导空白和尾部空白 |
trimResults(CharMatcher) | 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符 |
limit(int) | 限制拆分出的字符串数量 |
如果你想要拆分器返回List,只要使用Lists.newArrayList(splitter.split(string))或类似方法。 警告:splitter实例总是不可变的。用来定义splitter目标语义的配置方法总会返回一个新的splitter实例。这使得splitter实例都是线程安全的,你可以将其定义为static final常量。
参考来源:http://ifeve.com/google-guava-using-and-avoiding-null/
参考来源:http://ifeve.com/google-guava-strings/
参考来源:https://www.yiibai.com/guava/guava_collections_utilities.html