Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。
本文使用的Guava版本如下:
<!--guava--> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>25.1-jre</version> </dependency>
Object.equals
当一个对象中的字段可以为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 }
Optional
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<Integer> a = Optional.fromNullable(value1); Optional<Integer> c = Optional.fromNullable(value2); /** * 创建指定引用的Optional实例,若引用为null则快速失败 */ // Optional<Integer> b = Optional.of(value1); // java.lang.NullPointerException Optional<Integer> 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
前置条件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. } }
连接器[Joiner]
用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦。如果字符串序列中含有null,那连接操作会更难。Fluent风格的Joiner让连接字符串更简单。
/** * @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<String, String> 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 }
拆分器[Splitter]
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<String> 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