Guava是Google的Java核心库,基于Java5+.
Guava由
com.google.common.annotations
com.google.common.base
com.google.common.base.internal
com.google.common.collect
com.google.common.io
com.google.common.net
com.google.common.primitives
com.google.common.util.concurrent
这些包组成.其中base包中提供了一些与commons-lang类似的功能类.比如toString,equals方法的构造器.字符串处理的相关静态方法.但是Guava中提供等价功能的API更加易用,也更灵活.现在就从base包开始讲起.
[size=small;]com.google.common.base[/size]
Objects类
public class Person {
final String name, nickname;
final Movie favMovie;
@Override public boolean equals(Object object) {
if (object instanceof Person) {
Person that = (Person) object;
return Objects.equal(this.name, that.name)
&& Objects.equal(this.nickname, that.nickname)
&& Objects.equal(this.favMovie, that.favMovie);
}
return false;
}
@Override public int hashCode() {
return Objects.hashCode(name, nickname, favMovie);
}
@Override public String toString() {
return Objects.toStringHelper(this)
.add("name", name)
.add("nickname", nickname)
.add("favMovie", favMovie)
.toString();
}
public String preferredName() {
return Objects.firstNonNull(nickname, name);
}
上述代码显示了Objects中几乎所有方法.此外还有一个equal静态方法.方法签名如下:
static boolean equal(Object a, Object b)
该方法可以安全的传入null值,避免抛出NullPointerException.
Preconditions类
这个类提供了一些静态方法check*,可以使用这些方法在自己的方法中检查参数的正确性.
if (state != State.PLAYABLE) {
throw new IllegalStateException("Can't play movie; state is " + state);
}
上述代码可以替换为如下
Preconditions.checkState(state == State.PLAYABLE,"Can't play movie; state is %s", state);
字符串处理相关的类CharMathcer,Joiner,Splitter.
这些类都使用了链式调用做配置,所以使用起来非常方便灵活,行为的可定制性极强.
所谓的字符串处理无非是找到指定的字符提取出来,然后进一步做处理.
CharMatcher就是做查找提取字符串的类,在一定程度上可以代替正则表达式做字符串匹配,但是其API要比使用正则表达式更容易些.写出的代码的可读性当然是正则表达式不可比拟的.
该类的声明中有@Beta标注,API尚不稳定,不建议在工作项目中使用.还是乖乖是用正则表达式吧.
//使用预定义常量构建CharMatcher实例
CharMatcher.WHITESPACE (tracks Unicode defn.)
CharMatcher.JAVA_DIGIT
CharMatcher.ASCII
CharMatcher.ANY
//使用工厂方法构建CharMatcher实例
CharMatcher.is('x')
CharMatcher.isNot('_')
CharMatcher.oneOf("aeiou").negate()
CharMatcher.inRange('a', 'z').or(inRange('A', 'Z'))
//或者继承CharMatcher并实现自己的matches(char c)方法.
得到一个CharMatcher实例后,可以对该实例进行如下操作
boolean matchesAllOf(CharSequence)
boolean matchesAnyOf(CharSequence)
boolean matchesNoneOf(CharSequence)
int indexIn(CharSequence, int)
int lastIndexIn(CharSequence, int)
int countIn(CharSequence)
String removeFrom(CharSequence)
String retainFrom(CharSequence)
String trimFrom(CharSequence)
String trimLeadingFrom(CharSequence)
String trimTrailingFrom(CharSequence)
String collapseFrom(CharSequence, char)
String trimAndCollapseFrom(CharSequence, char)
String replaceFrom(CharSequence, char)
使用示例:
String seriesId =
CharMatcher.DIGIT.or(CharMatcher.is('-'))
.retainFrom(input);
Joiner用来组合字符串
//使用一个分隔符来连接文本片段
String s = Joiner.on(", ").join(episodesOnDisc);
//Joiner实例是可配置的
StringBuilder sb = ...;
Joiner.on("|").skipNulls().appendTo(sb, attrs);
//甚至可以使用Joiner处理Map类型
static final MapJoiner MAP_JOINER = Joiner.on("; ")
.useForNull("NODATA")
.withKeyValueSeparator(":");
注意该类是不可变的所以如下的代码是错误的
// 直接在实例上调用配置方法对该实例并无影响,需要使用配置方法的返回值.
Joiner joiner = Joiner.on(',');
joiner.skipNulls(); // does nothing!
return joiner.join("wrong", null, "wrong");
Splitter类,如其名可知与Joiner相反该类用来将文本分隔成片段,对比JDK中的split方法,Splitter更加灵活,行为也更加明确.
使用Spltter做文本分隔,可以选择如下形式的分隔符
- 一个单独的字符: Splitter.on('\n')
- 一个字符串字面量: Splitter.on(", ")
- 一个正则表达式: Splitter.onPattern(",\\s*")
- 任何的CharMatcher实例(上面提到过的)
- 使用固定的长度: Splitter.fixedLength(8)
使用示例
Iterable<String> pieces =
Splitter.on(',').split("trivial,example")
//按顺序返回"trivial"和"example"
String.split方法需要使用正则表达式,返回数组.
Splitter更加灵活
//默认的行为十分简单明了
//[" foo", " ", "bar", " quux", ""]
Splitter.on(',').split(" foo, ,bar, quux,")
If you want extra features, ask for them!
//["foo", "bar", "quux"]
Splitter.on(',').trimResults().omitEmptyStrings().split(" foo, ,bar, quux,")
//配置方法的顺序无关紧要
Strings类提供了几个字符串相关的静态工具方法
emptyToNull,nullToEmpty,padStart,padEnd,repeat,isNullOrEmpty.只要看到这些方法名称就知道方法的行为和用法了.再此就不多讲了.
除了上述的常用功能类外,base包中还提供了一些基本的抽象接口.
例如Function,Predicate,Supplier,以及相关的Functions,Predicates,Suppliers工具类.有关这部分内容在之后的连载中结合其它的包进行说明.
[size=small;]com.google.common.primitives[/size]
这是一个帮助开发者使用原始类型的包,如果开发者需要使用原始类型相关的方法,现在可以
- 检查原始类型的包装器类
- 检查java.util.Arrays
- 检查com.google.common.primitives
- 如果都没有那可能不存在需要的方法
方法如下表所示
Method | Longs | Ints | Shorts | Chars | Doubles | Bytes | S.Bytes | U.Bytes | Booleans |
hashCode | X | X | X | X | X | X | | | X |
compare | X | X | X | X | X | | X | X | X |
checkedCast | | X | X | X | | | X | X | |
saturatedCast | | X | X | X | | X | X | |
contains | X | X | X | X | X | X | | | |
indexOf | X | X | X | X | X | X | | | X |
lastIndexOf | X | X | X | X | X | X | | | X |
min | X | X | X | X | X | | X | X | |
max | X | X | X | X | X | | X | X | |
concat | X | X | X | X | X | X | | | X |
join | X | X | X | X | X | | X | X | X |
toArray | X | X | X | X | X | X | | | X |
asList | X | X | X | X | X | X | | | X |
lexComparator | X | X | X | X | X | | X | X | X |
toByteArray | X | X | X | X | | | | | |
fromByteArray | X | X | X | X | | | | | |
[size=small;]com.google.common.io/size]
如果要使用流,文件,缓存之类输入输出的操作,就可以看看这个包提供的内容.
这里就要说一下base包中的Supplier接口,该接口可以提供一种类型的对象,从语义上讲类似于工厂,生成器,构造器等等,具体行为当然是依赖于实现的.
Suppliers中提供了一些获取有用的Supplier实例的静态方法.例如ofInstance(T instance) ,调用该方法可以得到一个永远返回instance的supplier.
memoize(Supplier<T> delegate) 会缓存第一次调用get()得到的值(这个值使用delegate的get方法得到),在接下来对get()的调用时返回该值.
synchronizedSupplier(Supplier<T> delegate) 显而易见,调用该方法可以得到delegate的线程安全版本,对delegate的get操作施加同步处理.
下面是io包中的两个关键接口
public interface InputSupplier<T> {
T getInput() throws IOException;
}
public interface OutputSupplier<T> {
T getOutput() throws IOException;
}
例如:InputSupplier<InputStream>,OutputSupplier<Writer>等等,这样可以使包中的实用工具对各种类型的I/O都有用.
ByteStrsams和CharStreams分别是对应字节流(InputStream,OutputStream)和字符流(Reader,Writer)的使用工具类.
ByteStreams提供的操作如下:
- byte[] toByteArray(InputStream)
- byte[] toByteArray(InputSupplier)
- void readFully(InputStream, byte[])
- void write(byte[], OutputSupplier)
- long copy(InputStream, OutputStream)
- long copy(InputSupplier, OutputSupplier)
- long length(InputSupplier)
- boolean equal(InputSupplier, InputSupplier)
- InputSupplier slice(InputSupplier, long, long)
- InputSupplier join(InputSupplier...)
CharStreams提供的操作也是类似的,只是将处理的目标换成Reader,Writer,String和CharSequence(而且这些操作通常需要指定一个Charset)
Files顾名思义是跟File一起工作的实用工具类,提供比ByteStreams,CharStreams更好抽象等级的操作.如下
- byte[] toByteArray(File)
- String toString(File, Charset)
- void write(byte[], File)
- void write(CharSequence, File, Charset)
- long copy(File, File)
- long copy(InputSupplier, File)
- long copy(File, OutputSupplier)
- long copy(File, Charset, Appendable)
- long move(File, File)
- boolean equal(File, File)
- List<String> readLines(File, Charset)
JDK7 有更合适的io操作抽象API和语法.待JDK7正式发布的时候,或许就不再需要其他的第三方io实用工具包了.
分享到:
相关推荐
本学习笔记将重点介绍Guava中的几个核心工具类:Joiner、Splitter、Preconditions。 1. Joiner类与Splitter类 Joiner类的主要功能是将集合中的元素拼接成一个字符串。通过指定分隔符,可以灵活地将集合或Map中的...
Guava学习笔记笔记的大部分中文翻译内容来源于以下译者: 沉义扬,罗立树,何一昕,武祖校对:方腾飞感谢给我们带来的这一系列好文章。引言Guava工程包含了若干被Google的Java项目广泛依赖的核心库,例如:集合...
Guava的学习笔记.docx文件可能包含了对以上概念的详细解释和示例代码,而未命名的压缩包子文件可能是实际的代码示例或者更深入的案例研究。通过阅读这些材料,你可以深入了解Guava库的用法,并将其应用于你的项目中...
"java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...
【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或...
Guava-Event-Bus 学习笔记 Guava的EventBus源码学习,基于Guava的18.0版本 分析者: ###1. 背景简介 EventBus是google的一个Java工具包其中的一个工具类,类似的有多个版本其中包括移植到Android端的 和改良的,功能...
6、**限流**:在高并发场景下,限流策略可以保护系统稳定,RuoYi可能利用如Guava RateLimiter或Spring Cloud Gateway等工具实现。 7、**幂等性处理**:防止表单重复提交是幂等性的一个应用场景,通过令牌机制或唯一...
Java 8 引入了许多创新特性,其中最引人注目的包括Lambda表达式、Stream API、Try-with-resource语句以及对现有库如Guava的改进。下面将详细介绍这些内容。 **Lambda表达式** Lambda表达式是Java 8中的一个关键...
这可以通过如Guava库的RateLimiter或Spring Cloud Gateway的限流插件实现。 2. **分布式锁**:在减库存操作时,使用分布式锁确保同一时刻只有一个请求能够执行,避免并发问题。可以使用Redis的setnx命令或者...
标签中提到的“源码”和“工具”,暗示这份学习笔记可能涉及到Guava库的使用,Guava是Google提供的一款广泛用于Java开发的开源库,特别在并发处理和缓存管理方面有着强大的功能。 在提供的压缩包文件中,我们有五份...
Java 的学习笔记和整理的知识点,包含Java语言基础、Java服务端方向的框架、设计模式、计算机网络、算法、Java 虚拟机和数据库等多个方面的内容。想了解前端的内容参考,Android相关的内容参考。 目录结构 语言基础...
在准备阶段,学习者需要准备好在线编译工具、记笔记软件、Markdown语法编写等基本技能,以便更好地学习编程。在Java入门阶段,学习者需要掌握Java编程基础、环境搭建、IDEA开发工具、新建项目、运行调试、界面配置、...
【标题】:“Java笔记fdsfdsfdsdf”实际上可能是指一份关于Java编程语言的学习笔记,其中“fdsfdsfdsdf”可能是由于输入错误或者是个无意义的占位符。在这个标题下,我们可以推测笔记内容可能涵盖了Java的基础到进阶...
6. **笔记与教学材料**(notes):这里可能是作者在学习过程中整理的笔记,可能涵盖了各个知识点的解析、例子和问题解答,是很好的学习参考资料。 7. **Spring Batch**:这是一个强大的批处理框架,用于执行大规模...
《Gradle笔记——Java开发者的进阶指南》 Gradle,作为一款强大的构建工具,以其灵活性和高效性深受开发者喜爱,尤其在Java开发领域。它借鉴了Maven的优点,同时弥补了Maven的一些不足,使得项目构建过程更加简单且...
最后,笔记可能涵盖了其他工具类和框架的使用,例如Spring框架用于依赖注入和AOP(面向切面编程),MyBatis简化SQL操作,还有可能涉及Apache Commons或Google Guava等实用工具库,它们提供了许多方便的函数和数据...
同时,后端与前端的交互过程中,JWT用于身份验证,Guava提供了额外的工具类和集合类,JMeter5.X用于性能测试,确保系统的稳定性和性能。 在部署环节,文档提到了使用CentOS7作为服务器操作系统,Nginx作为反向代理...
它旨在帮助开发者通过Markdown格式整理和分享他们的学习笔记,同时也涵盖了其他技术领域如Vue.js、Node.js、Android学习以及Guava库的常用解析。 【描述】该项目可能是正在进行中的工作,因为提到了"可能未完结",...
heavyz的Tomcat学习笔记(包括启动流程分析、启动脚本分析) ] () [ java8 新特性讲解系列文章 ] () [ Java 从Jar文件中动态加载类 ] () [ Java并发源码分析 - ThreadPoolExecutor ] () [ java ClassLoader 基本原理 ]...