- 以面向对象思想处理字符串
- 对基本类型进行支持
- 总结
概述
1、Guava是google公司开发的一款Java类库扩展工具包,包括新的集合类型(如 multimap 和 multiset)、不可变集合、图形库,以及用于缓存、并发、I/O等实用程序。使用这些API一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多jdk中没有的功能,能让我们开发中更为高效。
2、Guava github 开源地址:https://gitcode.net/mirrors/google/guava
3、官网用户手册:https://github.com/google/guava/wiki
POM依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1.1-jre</version>
</dependency>
一、以面向对象思想处理字符串(Joiner/Splitter/CharMatcher)
JDK提供的String还不够好么?
也许还不够友好,至少我们用起来还不是特别够爽,还得进行其余的操作!
举例:比如String的split()方法,我们得校验空字符串的问题,还得考虑返回的结果是否存在null元素,只提供了前后trim()的方法(但中间元素存在空或null呢)。
guava帮你解决,实例如下:
// 连接器
private static final Joiner JOINER = Joiner.on(",").skipNulls();
// 分割器
private static final Splitter SPLITTER = Splitter.on(",").trimResults().omitEmptyStrings();
public static void main(String[] args) {
// 把集合或数组中的元素拼接在一起
String join = JOINER.join(Lists.newArrayList("a", null, "b"));
System.out.println("拼接后的字符串:" + join);
// 分隔处理
for (String tmp : SPLITTER.split("a, ,b,,")) {
System.out.println("|" + tmp + "|");
}
}
打印结果:
Joiner是连接器,Splitter是分割器,通常我们会把它们定义为static final,利用on生成对象后在应用到String进行处理,这块是可以复用的。要知道apache commons StringUtils提供的都是static method。更加重要的是,guava提供的Joiner/Splitter是经过充分测试,它的稳定性和效率要比apache高出不少,这个小伙伴们可以自行测试下~
发现没有我们想对String做什么操作,就是生成自己定制化的Joiner/Splitter,多么贴心、多效的API!
对于Joiner,常用的方法是:
1.跳过NULL元素:skipNulls()
2.对于NULL元素使用其他替代:useForNull(String)
对于Splitter,常用的方法是:trimResults()/omitEmptyStrings()。注意拆分的方式,有字符串,还有正则,还有固定长度分割(太贴心了!)
其实除了Joiner/Splitter外,guava还提供了字符串匹配器:CharMatcher(将字符的匹配和处理解耦,并提供丰富的方法供你使用)
CharMatcher:
1、默认实现类:
CharMatcher本身提供了很多CharMatcher实现类,如下:
ANY: 匹配任何字符;
ASCII: 匹配是否是ASCII字符;
BREAKING_WHITESPACE: 匹配所有可换行的空白字符(不包括非换行空白字符,例如"\u00a0");
DIGIT: 匹配ASCII数字 ;
INVISIBLE: 匹配所有看不见的字符;
JAVA_DIGIT: 匹配UNICODE数字, 使用 Character.isDigit() 实现;
JAVA_ISO_CONTROL: 匹配ISO控制字符, 使用 Charater.isISOControl() 实现;
JAVA_LETTER: 匹配字母, 使用 Charater.isLetter() 实现;
JAVA_LETTER_OR_DIGET: 匹配数字或字母;
JAVA_LOWER_CASE: 匹配小写;
JAVA_UPPER_CASE: 匹配大写;
NONE: 不匹配所有字符;
SINGLE_WIDTH: 匹配单字宽字符, 如中文字就是双字宽;
WHITESPACE: 匹配所有空白字符。
2、常用操作方法:
CharMatcher is(char match): 返回匹配指定字符的Matcher;
CharMatcher isNot(char match): 返回不匹配指定字符的Matcher;
CharMatcher anyOf(CharSequence sequence): 返回匹配sequence中任意字符的Matcher;
CharMatcher noneOf(CharSequence sequence): 返回不匹配sequence中任何一个字符的Matcher;
CharMatcher inRange(char startInclusive, char endIncludesive): 返回匹配范围内任意字符的Matcher;
CharMatcher forPredicate(Predicate<? super Charater> predicate): 返回使用predicate的apply()判断匹配的Matcher;
CharMatcher negate(): 返回以当前Matcher判断规则相反的Matcher;
CharMatcher and(CharMatcher other): 返回与other匹配条件组合做与来判断的Matcher;
CharMatcher or(CharMatcher other): 返回与other匹配条件组合做或来判断的Matcher;
boolean matchesAnyOf(CharSequence sequence): 只要sequence中有任意字符能匹配Matcher,返回true;
boolean matchesAllOf(CharSequence sequence): sequence中所有字符都能匹配Matcher,返回true;
boolean matchesNoneOf(CharSequence sequence): sequence中所有字符都不能匹配Matcher,返回true;
int indexIn(CharSequence sequence): 返回sequence中匹配到的第一个字符的坐标;
int indexIn(CharSequence sequence, int start): 返回从start开始,在sequence中匹配到的第一个字符的坐标;
int lastIndexIn(CharSequence sequence): 返回sequence中最后一次匹配到的字符的坐标;
int countIn(CharSequence sequence): 返回sequence中匹配到的字符计数;
String removeFrom(CharSequence sequence): 删除sequence中匹配到到的字符并返回;
String retainFrom(CharSequence sequence): 保留sequence中匹配到的字符并返回;
String replaceFrom(CharSequence sequence, char replacement): 替换sequence中匹配到的字符并返回;
String trimFrom(CharSequence sequence): 删除首尾匹配到的字符并返回;
String trimLeadingFrom(CharSequence sequence): 删除首部匹配到的字符;
String trimTrailingFrom(CharSequence sequence): 删除尾部匹配到的字符;
String collapseFrom(CharSequence sequence, char replacement): 将匹配到的组(连续匹配的字符)替换成replacement ;
String trimAndCollapseFrom(CharSequence sequence, char replacement): 先trim在replace。
例子:
public static void main(String[] args) {
// 只保留匹配的字符并移除其他字符
System.out.println(CharMatcher.digit().retainFrom("1hs2fsl3ds4g5-"));
// 移除匹配的字符
System.out.println(CharMatcher.digit().removeFrom("i love java 1314"));
// 将匹配的字符用“*”号替换
System.out.println(CharMatcher.inRange('a', 'f').or(CharMatcher.is('n')).replaceFrom("zhangsanfeng", "*"));
}
打印结果:
二、对基本类型进行支持
guava对JDK提供的原生类型操作进行了扩展,使得功能更加强大!
public static void main(String[] args) {
// 快速完成到集合的转换
List<Integer> list = Ints.asList(1, 3, 5, 7, 9);
System.out.println(list);
String join = Ints.join(",", 1, 3, 1, 4);
System.out.println(join);
// 原生类型数组快速合并
int[] newIntArray = Ints.concat(new int[]{1, 2}, new int[]{2, 3, 4});
System.out.println(Arrays.toString(newIntArray));
// 取最大值和最小值
int max = Ints.max(newIntArray);
int min = Ints.min(newIntArray);
System.out.println("最大值:" + max);
System.out.println("最小值:" + min);
// 是否包含指定元素
System.out.println("是否包含:" + Ints.contains(newIntArray, 6));
// 集合到数组的转换
int[] array = Ints.toArray(list);
System.out.println(array);
}
打印结果:
Guava提供了Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans这些基本数据类型的扩展支持,只有你想不到的,没有它没有的!