1.Objects.equal(),不用对它们进行null检查

Objects.equal("a", "a"); // returns trueObjects.equal(null, "a"); // returns falseObjects.equal("a", null); // returns falseObjects.equal(null, null); // returns true

2.有关实现比较器,ComparisonChain执行一种懒比较:它执行比较操作直至发现非零的结果,在那之后的比较输入将被忽略

public int compareTo(Foo that) {    return ComparisonChain.start()            .compare(this.aString, that.aString)            .compare(this.anInt, that.anInt)            .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())            .result();}

注: compare(Comparable<?> left, Comparable<?> right) && compare(T left, T right, Comparator comparator) 最后的result返回比较结果,若都相等返回0

3.流畅风格比较器,Ordering是Guava流畅风格比较器Comparator的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。

Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Foo, String>() {  public String apply(Foo foo) {    return foo.sortedBy;  }});

当阅读链式调用产生的排序器时,应该从后往前读

Ordering排序器的应用方法

集合(Collections)

1.不可变集合(不支持null值),虽然JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但是guava的不可变集合进行了改良

构建方法

1. copyOf方法,如ImmutableSet.copyOf(set);2. of方法,如ImmutableSet.of(“a”, “b”, “c”)或 ImmutableMap.of(“a”, 1, “b”, 2);3. Builder工具    public static final ImmutableSet<Color> GOOGLE_COLORS =        ImmutableSet.<Color>builder()            .addAll(WEBSAFE_COLORS)            .add(new Color(0, 191, 255))            .build();

关联可变集合和不可变集合,如下

2.Multiset:没有元素顺序限制的ArrayList,Map,键为元素,值为计数

3.Multimap:把一个键映射到多个值,如a -> 1 a -> 2 a ->4 b -> 3 c -> 5,Multimap.get(key)以集合形式返回键所对应的值视图

4.BiMap:可以用 inverse()反转BiMap的键值映射,保证值是唯一的,因此 values()返回Set而不是普通的Collection

5.Table: 实现多个键做索引 ,用Table<R, C, V>表现Map<R, Map<C, V>>

6.集合工具类:java.util.Collections是JDK提供的集合工具类,guava沿用这一方式,提供了更多好用的工具类

List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma");构造新的泛型集合去掉new重复声明类型,用工厂方法模式,方便在初始化时指定起始元素

有关Sets提供很多标准的集合运算方法

具体工具类方法,需要去查看源码方法,针对具体需求使用

缓存(Caches)

Guava cache和ConcurrentMap很相似,最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式的移除。

Guava cache是单机本地缓存

1.CacheLoader:

LoadingCache<Integer, String> cache = CacheBuilder.newBuilder()        .maximumSize(100)        .build(                new CacheLoader<Integer, String>() {                    @Override                    public String load(Integer key) {                        return key + "sss";                    }                }        );//cache为0System.out.println(cache);//有则直接返回,没有则添加缓存后返回System.out.println(cache.getUnchecked(1));//cache为1System.out.println(cache);

2.Callable:get(K, Callable)方法,返回缓存中相应的值,或者用给定的Callable运算并把结果加入到缓存中,这个方法简便地实现了模式”如果有缓存则返回;否则运算、缓存、然后返回”

3.cache.put(key, value)方法 显式的直接插入修改缓存,Cache.invalidate(key)方法 显式的删除

4.缓存回收:

基于容量回收

定时回收:定时回收周期性地在写操作中执行,偶尔在读操作中执行

基于引用回收

并发(Concurrency)

1.ListenableFuture接口继承JDK concurrent包下的Future接口

传统JDK中的Future通过异步的方式计算返回结果:在多线程运算中可能或者可能在没有结束返回结果,Future是运行中的多线程的一个引用句柄,确保在服务执行返回一个Result,ListenableFuture可以允许你注册回调方法(callbacks),在运算(多线程执行)完成的时候进行调用, 或者在运算(多线程执行)完成后立即执行。这样简单的改进,使得可以明显的支持更多的操作,这样的功能在JDK concurrent中的Future是不支持的

2.使用ListenableFuture 最重要的理由是它可以进行一系列的复杂链式的异步操作

字符串处理(Strings)

1.连接器Joiner:字符串中有null,处理起来更方便

Joiner joiner = Joiner.on("; ").skipNulls();Joiner joiner = Joiner.on("; ").useForNull();return joiner.join("Harry", null, "Ron", "Hermione");

连接对象类型,将会调用toString的方法连接

2.拆分器Splitter:內建的String.split悄悄丢弃了尾部的分隔符(即”b,”按照”,”拆分,只得到b而忽略掉空字符串),Splitter实例用法如下

Splitter.on(',').trimResults()            .omitEmptyStrings()            .split("foo,bar,,   qux" );

3.字符匹配器CharMatcher:是对StringUtil类的升级

4.字符集Charsets:使用bytes = string.getBytes(Charsets.UTF_8)这种方式,而不是通过名称获取字符集实例

5.大小写格式CaseFormat:用于编程语言的命名规范,例子如下

CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "CONSTANT_NAME")); // returns "constantName"

原生类型(Primitives)

Java的原生类型就是指基本类型:byte、short、int、long、float、double、char和boolean

区间(Ranges)

Guava用更紧凑的方法表示范围

1.构建区间

Range.closed("left", "right"); //字典序在"left"和"right"之间的字符串,闭区间Range.lessThan(4.0); //严格小于4.0的double值...

2.区间运算,包括查询,关系,相连,交集,跨区间

3.有关根据区间创建离散域

I/O

字节流指的是InputStream或OutputStream,字符流指的是Reader 或Writer,guava相应的工具方法分别在ByteStreams 和CharStreams中

1.数据源包括File && Url,源是可读的,汇是可写的

2.源与汇的实现应该在每次openStream()方法被调用时都创建一个新的流。始终创建新的流可以让源或汇管理流的整个生命周期,并且让多次调用openStream()返回的流都是可用的。此外,如果你在创建源或汇之前创建了流,你不得不在异常的时候自己保证关闭流,这压根就违背了发挥源与汇API优点的初衷。

3.使用源与汇

//Read the lines of a UTF-8 text fileImmutableList<String> lines = Files.asCharSource(file, Charsets.UTF_8).readLines();//Count distinct word occurrences in a fileMultiset<String> wordOccurrences = HashMultiset.create(        Splitter.on(CharMatcher.WHITESPACE)            .trimResults()            .omitEmptyStrings()            .split(Files.asCharSource(file, Charsets.UTF_8).read()));//SHA-1 a fileHashCode hash = Files.asByteSource(file).hash(Hashing.sha1());//Copy the data from a URL to a fileResources.asByteSource(url).copyTo(Files.asByteSink(file));

散列(Hash)

1.散列包的组成:HashFunction,Hasher,Funnel,HashCode

2.布鲁姆过滤器(BloomFilter):检测某个对象是一定不在过滤器中,还是可能已经添加到过滤器

3.Hashing类,提供的函数如下

事件总线(EventBus)

Java的进程内事件分发都是通过发布者和订阅者之间的显式注册实现的。设计EventBus就是为了取代这种显示注册方式,使组件间有了更好的解耦

1.事件监听者(Listeners),按监听特定事件;把事件监听者注册到事件发生者;按事件超类监听;检测没有监听者的事件

2.事件生产者(Producers),管理和追踪监听者;向监听者分发事件

范例代码

// Class is typically registered by the container.class EventBusChangeRecorder {    @Subscribe public void recordCustomerChange(ChangeEvent e) {        recordChange(e.getChange());    }}// somewhere during initializationeventBus.register(new EventBusChangeRecorder());// much laterpublic void changeCustomer() {    ChangeEvent event = getChangeEvent();    eventBus.post(event);}

数学运算(Math)

1.整数运算,包括IntMath,LongMath,BigIntegerMath,包括有检查溢出的运算

2.实数运算

3.浮点数运算 DoubleMath

范例代码

int logFloor = LongMath.log2(n, FLOOR);int mustNotOverflow = IntMath.checkedMultiply(x, y);long quotient = LongMath.divide(knownMultipleOfThree, 3, RoundingMode.UNNECESSARY); // fail fast on non-multiple of 3BigInteger nearestInteger = DoubleMath.roundToBigInteger(d, RoundingMode.HALF_EVEN);BigInteger sideLength = BigIntegerMath.sqrt(area, CEILING);

参考文章 http://ifeve.com/google-guava/