Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。

guava类似Apache Commons工具集

基本工具包Base

Optional

guava的Optional类似于Java 8新增的Optional类,都是用来处理null的,不过guava的是抽象类,其实现类为Absent和Present,而java.util的是final类。其中一部分方法名是相同的。

Guava用Optional表示可能为null的T类型引用。一个Optional实例可能包含非null的引用(我们称之为引用存在),也可能什么也不包括(称之为引用缺失)。它从不说包含的是null值,而是用存在或缺失来表示。但Optional从不会包含null值引用。

import com.google.common.base.Optional;

/**
* Guava用Optional表示可能为null的T类型引用。
*
* @author LENOVO
*
*/
public class OptionalDemo { public static void main(String[] args) {
Integer value1 = null;
Integer value2 = 10;
/*
* 创建指定引用的Optional实例,若引用为null则快速失败返回absent() absent()创建引用缺失的Optional实例
*/
Optional<Integer> a = Optional.fromNullable(value1);
Optional<Integer> b = Optional.of(value2); // 返回包含给定的非空引用Optional实例
System.out.println(sum(a, b));
} private static Integer sum(Optional<Integer> a, Optional<Integer> b) {
// isPresent():如果Optional包含非null的引用(引用存在),返回true
System.out.println("First param is present: " + a.isPresent());
System.out.println("Second param is present: " + b.isPresent());
Integer value1 = a.or(0); // 返回Optional所包含的引用,若引用缺失,返回指定的值
Integer value2 = b.get(); // 返回所包含的实例,它必须存在,通常在调用该方法时会调用isPresent()判断是否为null
return value1 + value2;
}
}

运行返回:

First param is present: false
Second param is present: true
10

  

Preconditions

前置条件Preconditions提供静态方法来检查方法或构造函数,被调用是否给定适当的参数。它检查的先决条件。其方法失败抛出IllegalArgumentException。

import com.google.common.base.Preconditions;

/**前置条件Preconditions提供静态方法来检查方法或构造函数
* @author LENOVO
*
*/
public class PreconditionDemo { public static void main(String[] args) {
try {
getValue(5);
} catch (IndexOutOfBoundsException e){
System.out.println(e.getMessage());
} try {
sum(4,null);
} catch (NullPointerException e){
System.out.println(e.getMessage());
} try {
sqrt(-1);
} catch (IllegalArgumentException e){
System.out.println(e.getMessage());
} } private static double sqrt(double input){
Preconditions.checkArgument(input>0.0,
"Illegal Argument passed: Negative value %s.",input);
return Math.sqrt(input);
} private static int sum(Integer a,Integer b){
a=Preconditions.checkNotNull(a,
"Illegal Argument passed: First parameter is Null.");
b=Preconditions.checkNotNull(b,
"Illegal Argument passed: Second parameter is Null.");
return a+b;
} private static int getValue(int input){
int[] data={1,2,3,4,5};
int index=Preconditions.checkElementIndex(input,data.length,
"Illegal Argument passed: Invalid index.");
return data[index];
} }

  返回:

Illegal Argument passed: Invalid index. (5) must be less than size (5)
Illegal Argument passed: Second parameter is Null.
Illegal Argument passed: Negative value -1.0.

  

Joiner

Joiner 提供了各种方法来处理字符串加入操作,对象等。

Joiner的实例不可变的,因此是线程安全的。

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map; import com.google.common.base.Joiner; /**Joiner 提供了各种方法来处理字符串加入操作,对象等
* @author LENOVO
*
*/
public class JoinerDemo { public static void main(String[] args) {
/*
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(sb);
System.out.println(Joiner.on(",").useForNull("none").join(1,null,3));
System.out.println(Joiner.on(",").skipNulls().join(Arrays.asList(1,2,3,4,null,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));
}
}

  返回:

Hello,guava
1,none,3
1,2,3,4,6
key1=value1,key2=value2,key3=value3

  

Splitter

Splitter 能够将一个字符串按照指定的分隔符拆分成可迭代遍历的字符串集合,Iterable

import com.google.common.base.Splitter;

/**Splitter 能够将一个字符串按照指定的分隔符拆分成可迭代遍历的字符串集合
* @author LENOVO
*
*/
public class SplitterDemo { public static void main(String[] args) {
/*
on():指定分隔符来分割字符串
limit():当分割的子字符串达到了limit个时则停止分割
fixedLength():根据长度来拆分字符串
trimResults():去掉子串中的空格
omitEmptyStrings():去掉空的子串
withKeyValueSeparator():要分割的字符串中key和value间的分隔符,分割后的子串中key和value间的分隔符默认是=
*/
System.out.println(Splitter.on(",").limit(3).trimResults().split(" a, b, c, d"));//[ a, b, c,d]
System.out.println(Splitter.fixedLength(3).split("1 2 3"));//[1 2, 3]
System.out.println(Splitter.on(" ").omitEmptyStrings().splitToList("1 2 3"));
System.out.println(Splitter.on(",").omitEmptyStrings().split("1,,,,2,,,3"));//[1, 2, 3]
System.out.println(Splitter.on(" ").trimResults().split("1 2 3")); //[1, 2, 3],默认的连接符是,
System.out.println(Splitter.on(";").withKeyValueSeparator(":").split("a:1;b:2;c:3"));//{a=1, b=2, c=3}
} }

  返回:

[a, b, c,  d]
[1 2, 3]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
{a=1, b=2, c=3}

  

Objects

java7及以后的版本建议使用jdk中的Objects类

EventBus

Guava为我们提供了事件总线EventBus库,它是事件发布-订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计。

Guava为我们提供了同步事件EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的。

Guava发布的事件默认不会处理线程安全的,但我们可以标注@AllowConcurrentEvents来保证其线程安全

如果Listener A监听Event A, 而Event A有一个子类Event B, 此时Listener A将同时接收Event A和B消息

事件

/**Guava 发布-订阅模式中传递的事件,是一个普通的POJO类
* @author LENOVO
*
*/
public class OrderEvent { // 事件
private String message; public OrderEvent(String message) {
this.message = message;
} public String getMessage() {
return message;
}
}

订阅

import com.google.common.eventbus.Subscribe;

public class EventListener { // 订阅者

	// @Subscribe保证有且只有一个输入参数,如果你需要订阅某种类型的消息,只需要在指定的方法上加上@Subscribe注解即可
@Subscribe
public void listen(OrderEvent event) {
System.out.println("receive message: " + event.getMessage());
} /*
* 一个subscriber也可以同时订阅多个事件 Guava会通过事件类型来和订阅方法的形参来决定到底调用subscriber的哪个订阅方法
*/
@Subscribe
public void listen(String message) {
System.out.println("receive message: " + message);
}
}

多个订阅者

import com.google.common.eventbus.Subscribe;

public class MultiEventListener {

	@Subscribe
public void listen(OrderEvent event) {
System.out.println("receive msg: " + event.getMessage());
} @Subscribe
public void listen(String message) {
System.out.println("receive msg: " + message);
}
}

  Demo:

import com.google.common.eventbus.EventBus;

public class EventBusDemo {

	public static void main(String[] args) {
EventBus eventBus = new EventBus("jack");
/*
* 如果多个subscriber订阅了同一个事件,那么每个subscriber都将收到事件通知
* 并且收到事件通知的顺序跟注册的顺序保持一致
*/
eventBus.register(new EventListener()); // 注册订阅者
eventBus.register(new MultiEventListener());
eventBus.post(new OrderEvent("hello")); // 发布事件
eventBus.post(new OrderEvent("world"));
eventBus.post("!");//只有他才会执行所有的事件
} }

  返回:

receive message: hello
receive msg: hello
receive message: world
receive msg: world
receive message: !
receive msg: !

  

DeadEvent

如果EventBus发送的消息都不是订阅者关心的称之为Dead Event。

import com.google.common.eventbus.DeadEvent;
import com.google.common.eventbus.Subscribe; public class DeadEventListener {
boolean isDelivered = true; @Subscribe
public void listen(DeadEvent event) {
isDelivered = false;
System.out.println(event.getSource().getClass() + " " + event.getEvent()); // source通常是EventBus
} public boolean isDelivered() {
return isDelivered;
}
}

  

参考:http://www.importnew.com/tag/guava

guava快速入门(一)的更多相关文章

  1. Guava快速入门

    Guava快速入门 Java诞生于1995年,在这20年的时间里Java已经成为世界上最流行的编程语言之一.虽然Java语言时常经历各种各样的吐槽,但它仍然是一门在不断发展.变化的语言--除了语言本身 ...

  2. guava快速入门(三)

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...

  3. guava快速入门(二)

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...

  4. Spring Boot 揭秘与实战(二) 数据缓存篇 - 快速入门

    文章目录 1. 声明式缓存 2. Spring Boot默认集成CacheManager 3. 默认的 ConcurrenMapCacheManager 4. 实战演练5. 扩展阅读 4.1. Mav ...

  5. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  6. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  7. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  8. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  9. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

随机推荐

  1. 将实体转换为Hashtable

    1.将实体转换为Hashtable,用于将实体参数处理为hashtable,方便sql参数传递 /// <summary> /// 将实体转换为Hashtable /// </sum ...

  2. sqlserver常用函数

    1.字符串函数 --ascii函数,返回字符串最左侧字符的ascii码值 SELECT ASCII('dsd') AS asciistr --ascii代码转换函数,返回指定ascii值对应的字符 ) ...

  3. Javascript实例 -- 计时器, 搜索框,selected联动

    计时器: <body> <input type="text" id="i1"> <input type="button& ...

  4. LOJ#6038. 「雅礼集训 2017 Day5」远行(LCT)

    题面 传送门 题解 要不是因为数组版的\(LCT\)跑得实在太慢我至于去学指针版的么--而且指针版的完全看不懂啊-- 首先有两个结论 1.与一个点距离最大的点为任意一条直径的两个端点之一 2.两棵树之 ...

  5. 洛谷P3964 [TJOI2013]松鼠聚会(坐标系变换)

    题面 传送门 题解 对于两个点\((x_i,y_i)\)和\(x_j,y_j\),我们定义它们之间的曼哈顿距离为 \[|x_i-x_j|+|y_i-y_j|\] 定义它们的切比雪夫距离为 \[\max ...

  6. Bootstrap中表单控件状态(验证状态)

      Bootstrap 表单 http://www.runoob.com/try/try2.php?filename=bootstrap3-form-controlstate (这链接里有简介) &l ...

  7. ZooKeeper学习1---简单介绍

    一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同 ...

  8. 本机号码认证黑科技:极光(JG)开发者服务推出“极光认证”新产品

    近日,中国领先的大数据服务商极光(JG)推出全新产品--极光认证JVerification.极光认证是极光针对APP用户注册登陆,二次安全验证等身份验证场景打造的一款本机号码认证SDK,验证用户提供的 ...

  9. windows mobile ,wince 系统,用代码启动cab文件安装

    有时候需要用代码来启动安装cab,以下是代码.不能实现静默安装. 启动后会提示用户是否安装,需要用户点击是才行. using System; using System.Collections.Gene ...

  10. C#中方法,方法声明,方法调用和方法重载!

      一,定义:方法是具有名称的可执行代码块. 二,方法的声明:声明方法的语法包括以下五个部分: 1,访问权限修饰符,这个是可选的参数,默认值是私有访问private,即只能从声明它的类的内部访问. 2 ...