之前看到的介绍guava的文章,把之前总结的整理了下
原文链接:Google Guava官方教程(中文版)
让使用Java语言变得更舒适
1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服。很多Guava工具类用快速失败拒绝null值,而不是盲目地接受
1.2 前置条件: 让方法中的条件检查更简单
1.3 常见Object方法: 简化Object方法实现,如hashCode()和toString()
1.4 排序: Guava强大的”流畅风格比较器”
1.5 Throwables:简化了异常和错误的传播与检查
package com.insightfullogic.java8.test;
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import java.util.ArrayList;
import java.util.List;
/**
* Created by user on 2018/6/30.
* guava学习笔记1,参考地址:http://ifeve.com/google-guava/
* 1.基本工具 [Basic utilities]
* 1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服。很多Guava工具类用快速失败拒绝null值,而不是盲目地接受
* 1.2 前置条件: 让方法中的条件检查更简单
* 1.3 常见Object方法: 简化Object方法实现,如hashCode()和toString()
* 1.4 排序: Guava强大的”流畅风格比较器”
* 1.5 Throwables:简化了异常和错误的传播与检查
* @author:bxy
* @Description:
* @Date:Created in 18:07 on 2018/6/30.
*/
public class GuavaTest1 {
public static void main(String[] args) {
try {
GuavaTest1 a = new GuavaTest1();
a.test1_1();
a.test1_2();
a.test1_3();
a.test1_4();
a.test1_5();
} catch (Exception e) {
e.printStackTrace();
}
}
public void test1_1(){
//Optional.of(T)
Optional p = Optional.of(5);
p.isPresent(); // returns true
System.out.println(p.get()); // returns 5
try {
Optional.of(null);// 若引用为null则快速失败
} catch (NullPointerException e) {
}
//Optional.absent() 创建引用缺失的Optional实例
Optional o1 = Optional.absent();
System.out.println(o1.isPresent());
//Optional.fromNullable(T) 返回一个包含给定数值的Present, 如果是null值, 返回具有某种类型的Absent.INSTANCE
o1 = Optional.fromNullable(11);
System.out.println(o1.get());
o1 = Optional.fromNullable(null);
System.out.println(o1.isPresent());
//非静态方法
//boolean isPresent() 如果Optional包含非null的引用(引用存在),返回true
//T get() 返回Optional所包含的引用,若引用缺失,则抛出java.lang.IllegalStateException
//T or(T) 返回Optional所包含的引用,若引用缺失,返回指定的值
//T orNull() 返回Optional所包含的引用,若引用缺失,返回null
//Set asSet() 返回Optional所包含引用的单例不可变集,如果引用存在,返回一个只有单一元素的集合,如果引用缺失,返回一个空集合。
Optional possible = Optional.of(5);
if (possible.isPresent()) { // true
System.out.println(possible.get()); // 5
}
System.out.println(possible.asSet()); // [5]
Optional absentValue = Optional.absent();
if (absentValue.isPresent()) { // false
System.out.println(absentValue.get());
}
System.out.println(absentValue.or(-1)); // -1
System.out.println(absentValue.orNull()); // null
System.out.println(absentValue.asSet()); // []
// absent is not null
//Objects.firstNonNull 新版本替换为MoreObjects.firstNonNull
System.out.println(MoreObjects.firstNonNull(possible, absentValue)); // Optional.of(5)
System.out.println(MoreObjects.firstNonNull(absentValue, possible)); // Optional.absent()
System.out.println(MoreObjects.firstNonNull(absentValue, absentValue)); // Optional.absent()
Optional nullValue = Optional.fromNullable(null);
if (nullValue.isPresent()) { // false
System.out.println(nullValue.get());
}
System.out.println(nullValue.or(-1)); // -1
System.out.println(nullValue.orNull()); // null
System.out.println(nullValue.asSet()); // []
System.out.println(MoreObjects.firstNonNull(possible, nullValue)); // Optional.of(5)
System.out.println(MoreObjects.firstNonNull(nullValue, possible)); // Optional.absent()
System.out.println(MoreObjects.firstNonNull(nullValue, nullValue)); // Optional.absent()
System.out.println(MoreObjects.firstNonNull(null, 1)); // 1
System.out.println(MoreObjects.firstNonNull(1, null)); // 1
// System.out.println(MoreObjects.firstNonNull(null, null)); // cause a java.lang.NullPointerException,新版本不能同时为null
}
/**
* 1.2 方法声明(不包括额外参数) 描述 检查失败时抛出的异常
* checkArgument(boolean) 检查boolean是否为true,用来检查传递给方法的参数。 IllegalArgumentException
* checkNotNull(T) 检查value是否为null,该方法直接返回value,因此可以内嵌使用checkNotNull。 NullPointerException
* checkState(boolean) 用来检查对象的某些状态。 IllegalStateException
* checkElementIndex(int index, int size) 检查index作为索引值对某个列表、字符串或数组是否有效。index>=0 && index=0 && index<=size * IndexOutOfBoundsException
* checkPositionIndexes(int start, int end, int size) 检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效* IndexOutOfBoundsException
*/
public void test1_2() throws Exception {
getPersonByPrecondition(8,"peida");
try {
getPersonByPrecondition(-9,"peida");
} catch (Exception e) {
System.out.println(e.getMessage());
}
try {
getPersonByPrecondition(8,"");
} catch (Exception e) {
System.out.println(e.getMessage());
}
try {
getPersonByPrecondition(8,null);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void getPersonByPrecondition(int age, String neme) throws Exception {
Preconditions.checkNotNull(neme, "neme为null");
Preconditions.checkArgument(neme.length() > 0, "neme为\'\'");
Preconditions.checkArgument(age > 0, "age 必须大于", 0);
System.out.println("a person age:" + age + ",neme:" + neme);
}
//新版本把Objects改为了MoreObjects,很多功能被jdk Objects吸收
public void test1_3(){
// MoreObjects mp=;
System.out.println(Objects.equal("a", "a")); // returns true
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
//MoreObjects.toStringHelper可以轻松编写有用的toString方法
System.out.println(MoreObjects.toStringHelper(this)
.add("x", 1)
.add("y", false)
.addValue("no")
.toString());//GuavaTest1{x=1, y=false, no}
//ComparisonChain替换比较器功能,懒比较:它执行比较操作直至发现非零的结果,在那之后的比较输入将被忽略。
UserTest u1 = new UserTest("a", 1);
UserTest u2 = new UserTest("b", 2);
UserTest u3 = new UserTest("a", 2);
System.out.println(u1.compareTo(u2));
System.out.println(u2.compareTo(u3));
}
/***
* 排序器[Ordering]是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。
* 从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器。
*
* 创建排序器:常见的排序器可以由下面的静态方法创建:
* 方法 描述
* natural() 对可排序类型做自然排序,如数字按大小,日期按先后排序
* usingToString() 按对象的字符串形式做字典排序[lexicographical ordering]
* arbitrary() 返回一个所有对象的任意顺序, 即compare(a, b) == 0 就是 a == b (identity equality)。 本身的排序是没有任何含义, 但是在VM的生命周期是一个常量。
* from(Comparator) 把给定的Comparator转化为排序器
*
* 链式调用方法:通过链式调用,可以由给定的排序器衍生出其它排序器:
* 方法 描述
* reverse() 获取语义相反的排序器
* nullsFirst() 使用当前排序器,但额外把null值排到最前面。
* nullsLast() 使用当前排序器,但额外把null值排到最后面。
* compound(Comparator) 合成另一个比较器,以处理当前排序器中的相等情况。
* lexicographical() 基于处理类型T的排序器,返回该类型的可迭代对象Iterable的排序器。
* onResultOf(Function) 对集合中元素调用Function,再按返回值用当前排序器排序。
*
* 运用排序器:Guava的排序器实现有若干操纵集合或元素值的方法
* 方法 描述 另 请参见
* greatestOf(Iterable iterable, int k) 获取可迭代对象中最大的k个元素。 leastOf
* isOrdered(Iterable) 判断可迭代对象是否已按排序器排序:允许有排序值相等的元素。 isStrictlyOrdered
* sortedCopy(Iterable) 判断可迭代对象是否已严格按排序器排序:不允许排序值相等的元素。 immutableSortedCopy
* min(E, E) 返回两个参数中最小的那个。如果相等,则返回第一个参数。 max(E, E)
* min(E, E, E, E...) 返回多个参数中最小的那个。如果有超过一个参数都最小,则返回第一个最小的参数。 max(E, E, E, E...)
* min(Iterable) 返回迭代器中最小的元素。如果可迭代对象中没有元素,则抛出NoSuchElementException。 max(Iterable), min(Iterator), max(Iterator)
*
* reverse(): 返回与当前Ordering相反的排序:
* nullsFirst(): 返回一个将null放在non-null元素之前的Ordering,其他的和原始的Ordering一样;
* nullsLast(): 返回一个将null放在non-null元素之后的Ordering,其他的和原始的Ordering一样;
* compound(Comparator): 返回一个使用Comparator的Ordering,Comparator作为第二排序元素,例如对bug列表进行排序,先根据bug的级别,再根据优先级进行排序;
* lexicographical(): 返回一个按照字典元素迭代的Ordering;
* onResultOf(Function): 将function应用在各个元素上之后, 在使用原始ordering进行排序;
* greatestOf(Iterable iterable, int k):返回指定的第k个可迭代的最大的元素,按照这个从最大到最小的顺序。是不稳定的。
* leastOf(Iterable iterable, int k):返回指定的第k个可迭代的最小的元素,按照这个从最小到最大的顺序。是不稳定的。
* isOrdered(Iterable): 是否有序,Iterable不能少于2个元素。
* isStrictlyOrdered(Iterable): 是否严格有序。请注意,Iterable不能少于两个元素。
* sortedCopy(Iterable): 返回指定的元素作为一个列表的排序副本。
*/
public void test1_4(){
List list = Lists.newArrayList();
list.add("peida");
list.add("jerry");
list.add("harry");
list.add("eva");
list.add("jhon");
list.add("neron");
System.out.println("list:"+ list);
Ordering naturalOrdering = Ordering.natural();
Ordering