简介
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。
学习和使用 Google Guava 可以写出更加优雅的Java代码。
这边文章我们先介绍一下:
以面向对象思想处理字符串:Joiner/Splitter/CharMatcher
连接器[Joiner]
Joiner是连接器,用分隔符把字符串连接起来。Joiner 我们通常会把它们定义为 static final ,利用on生成对象后,在应用到String 进行处理,这是可以复用的。
对于 Joiner 常用的方法:
- skipNulls: 跳过NULL元素\
- useForNull:对于NULL元素使用其他替代
//1.1 join 拼接集合中的元素
System.out.println("1.1 join 拼接集合中的元素:"+Joiner.on(";").join(Ints.asList(1,2,3)));//1;2;3
//1.2 skipNullls 过滤null
Joiner joiner = Joiner.on(";").skipNulls();
System.out.println("1.2 skipNullls 过滤null:"+joiner.join("hello",null,"world"));
//1.3 如果字符串为null,可以用固定字符串来代替
Joiner joiner2 = Joiner.on(";").useForNull("chinese");
System.out.println("1.3 如果字符串为null,可以用固定字符串来代替:"+joiner2.join("hello",null,"world"));
//1.4 Joiner 也可以用来连接对象
System.out.println("1.4 Joiner 也可以用来连接对象:"+Joiner.on(",").join(Arrays.asList(1,2,3)));
//1.5 withKeyValueSeparator 拼接map中的元素
System.out.println(Joiner.on("#").withKeyValueSeparator("=").join(ImmutableMap.of("a",1,"b",2)));//a=1#b=2
拆分器[Splitter]
对于 拆分器 Splitter 最常用的方法 是 : trimResults()/omitEmptyStrings();
拆分的方式有字符串、正则、还是有固定长度分割
拆分器工厂:
方法 | 描述 | 范例 |
---|---|---|
Splitter.on(char) | 按单个字符拆分 | Splitter.on(‘;’) |
Splitter.on(CharMatcher) | 按字符匹配器拆分 | Splitter.on(CharMatcher.BREAKING_WHITESPACE) |
Splitter.on(String) | 按字符串拆分 | Splitter.on(“, “) |
Splitter.on(Pattern) Splitter.onPattern(String) | 按正则表达式拆分 | Splitter.onPattern(“\r?\n”) |
Splitter.fixedLength(int) | 按固定长度拆分;最后一段可能比给定长度短,但不会为空。 | Splitter.fixedLength(3) |
拆分器修饰符
方法 | 描述 |
---|---|
omitEmptyStrings() | 从结果中自动忽略空字符串 |
trimResults() | 移除结果字符串的前导空白和尾部空白 |
trimResults(CharMatcher) | 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符 |
limit(int) | 限制拆分出的字符串数量 |
示例如下:
// 2.1 Splitter.on(char) 按照单个字符拆分 结果:[foo, bar, qux]
System.out.println("2.1 按照单个字符拆分:"+ Splitter.on(',').split("foo,bar,qux"));
// 2.2 Splitter.on(CharMatcher) 按字符匹配器拆分 结果: [2, 3, 4, 5, 6]
System.out.println("2.2 按字符匹配器拆分:"+ Splitter.on(CharMatcher.whitespace()).splitToList("2 3 4 5 6"));
// 2.3 Splitter.on(String) 按字符串拆分 //结果:[2, 3, 4, 5]
System.out.println("2.3 按字符串##拆分:"+ Splitter.on("##").splitToList("2##3##4##5"));
// 2.4 Splitter.onPattern(Pattern) 按正则表达式进行拆分 //结果:[abc, 8]
System.out.println("2.4 按正则表达式进行拆分:"+ Splitter.onPattern("(?=\\d)|\\W").split("abc8"));
// 2.5 omitEmptyStrings() 从结果中自动忽略空白字符串 结果: [ foo, bar ]
System.out.println("2.5 从结果中自动忽略空白字符串:"+ Splitter.on(',').omitEmptyStrings().split(" foo,,, bar ,"));
//2.6 trimResults() 移除结果字符串的前导空白和尾部空白 结果:[foo, , , bar, ]
System.out.println("2.6 从结果中自动忽略空白字符串:"+ Splitter.on(',').trimResults().split(" foo,,, bar ,"));
//2.7 trimResults(CharMatcher) 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符 结果:[, b]
System.out.println("2.7 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符:"+Splitter.on(";").trimResults(CharMatcher.anyOf("a")).splitToList("aa;b"));
// 2.8 limit 分割到指定个数便不再分割 结果:[aa;b;c]
System.out.println("2.8 limit 分割到指定个数便不再分割:"+Splitter.on(",").limit(2).splitToList("aa;b;c"));
// 2.9 转map
Map<String,String> map = Splitter.on(";").withKeyValueSeparator("=").split("a=1;b=2");
System.out.println("2.9 转map:"+map);
CharMatcher
CharMatcher 提供了一系列方法,让你对字符作特定类型的操作
- 修剪 - trim
- 折叠 - collapse
- 移除- remove
- 保留 - retain
等等
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
使用范例如下:
//3.1 CharMatcher.DIGIT 获取字符串中的数字 retainFrom:在字符序列中保留匹配字符,移除其他字符。
String s = "3333fff33342ff";
//String result1 = CharMatcher.digit().retainFrom(s);
String result1 = CharMatcher.javaDigit().replaceFrom(s,"*");
System.out.println("3.1.获取字符串中的数字:"+result1);
//3.2 把多个空格替换为_,去掉首尾空格 trimAndCollapseFrom:先trim在replace
String s2 = " dfd rer3 33 ";
String result2 = CharMatcher.whitespace().trimAndCollapseFrom(s2,'_');
System.out.println("3.2.把多个空格替换,并去掉首位的空格"+result2);
//3.3 获取所有的数字和小写字母
String s3 = "eee3333___dddee==33";
System.out.println("3.3 获取所有的数字和小写字母:"+CharMatcher.javaDigit().or(CharMatcher.javaLowerCase()).retainFrom(s3));
//3.4 获取所有的大写字母
String s4 = "DDDigithehhe";
System.out.println("3.4 获取所有的大写字母:"+CharMatcher.javaUpperCase().retainFrom(s4));
//3.5 把所有的数字用"*"代替
String s5 = "abcd1234dfgg";
System.out.println("3.5 把所有的数字用*代替:"+CharMatcher.javaDigit().replaceFrom(s5,"*"));
// 3.6 获取所有单字节长度的符号
String s6 = "chinese中国";
System.out.println("3.6 获取所有单字节长度的符号:"+CharMatcher.singleWidth().retainFrom(s6));
//3.7 获取字母
String s7 ="asdfgh123344444";
System.out.println("3.7 获取所有单字节长度的符号:"+CharMatcher.javaLetter().retainFrom(s7));
// 3.8 获取字母或者数字
String s8 ="asdfgh123344444-====";
System.out.println("3.8 获取所有单字节长度的符号:"+CharMatcher.javaLetterOrDigit().retainFrom(s8));