Guava,包含了若干被Google的Java项目广泛依赖的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。所有这些工具每天都在被Google的工程师应用在产品服务中。
一、连接器[Joiner]
连接器通过分隔符把字符串或者map连接起来,并可以替换或者跳过null。
| 方法 | 描述 | 
|---|
| Joiner.on(char separator) | 生成Joiner,连接字符为separator | 
| Joiner.on(String separator) | 生成Joiner,连接字符串为separator | 
| skipNulls() | 跳过null值 | 
| useForNull(String nullText) | 用nullText代替null值 | 
| withKeyValueSeparator(char keyValueSeparator) | 生成MapJoiner,k-v连接字符keyValueSeparator | 
| withKeyValueSeparator(String keyValueSeparator) | 生成MapJoiner,k-v连接字符串keyValueSeparator | 
| join(Iterable<?> parts) |   | 
| join(Iterator<?> parts) |   | 
| join(Object[] parts) |   | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  | @Test
public void joinerTest() {
    List<String> list = Lists.newArrayList("China", "Japan", null, "American");
    Map<String, String> map = new HashMap<>();
    map.put("CHN", "China");map.put("JP", "Japan");
    map.put("USA", "American");map.put(null, "Null");
    Joiner joiner = Joiner.on(";").skipNulls();
    String s = joiner.join(list);
    assertEquals("China;Japan;American", s);
    Joiner joiner1 = Joiner.on(";").useForNull("N/A");
    String s1 = joiner1.join(list);
    assertEquals("China;Japan;N/A;American", s1);
    Joiner joiner2 = Joiner.on("; ").useForNull("N/A");
    Joiner.MapJoiner mapJoiner = joiner2.withKeyValueSeparator(" -> ");
    String s2 = mapJoiner.join(map);
    log.info("MapJoiner join {}", s2);
    //[INFO] MapJoiner join {N/A -> Null;USA -> American;JP -> Japan;CHN -> China}
}
 | 
二、拆分器[Splitter]
JDK内建字符串拆分工具有一些古怪特性。比如,String.split丢弃了字符尾部的空白字符。
1
2
3
  | String[] ss = ",a,,b,".split(",");
log.info(Arrays.toString(ss));
//[INFO] [, a, , b]
 | 
使用拆分器可以避免以上奇怪问题,拆分器通过分隔符对字符串进行切分。
| 方法 | 描述 | 
|---|
| Splitter.on(char separator) | 生成Splitter,分隔字符为separator | 
| Splitter.on(CharMatcher separatorMatcher) | 生成Splitter,分隔符为guava的CharMatcher | 
| Splitter.on(String separator) | 生成Splitter,分隔字符串为separator | 
| Splitter.on(Pattern separatorPattern) | 生成Splitter,分隔符为正则表达式 | 
| Splitter.onPattern(String separatorPattern) | 生成Splitter,分隔符为正则表达式字符串 | 
| Splitter.fixedLength(int length) | 生成Splitter,使用固定切分长度 | 
| limit(int limit) | 限制切分数量 | 
| omitEmptyStrings() | 剔除空字符串 | 
| trimResults() | 剔除首尾空格 | 
| trimResults(CharMatcher trimmer) | 剔除首尾CharMatcher字符 | 
| withKeyValueSeparator(char separator) | 生成MapSplitter,k-v切分字符separator | 
| withKeyValueSeparator(String separator) | 生成MapSplitter,k-v切分字符串separator | 
| withKeyValueSeparator(Splitter keyValueSplitter) | 生成MapSplitter,k-v拆分器keyValueSplitter | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  | @Test
public void splitterTest() {
    String s = ";China; Japan;;American ; France ;";
    List<String> lists = Splitter.on(';').splitToList(s);
    log.info(lists.toString());
    //[INFO] [, China,  Japan, , American ,  France , ]
    lists = Splitter.on(";").trimResults().splitToList(s);
    log.info(lists.toString());
    //[INFO] [, China, Japan, , American, France, ]
    lists = Splitter.on(";").omitEmptyStrings().splitToList(s);
    log.info(lists.toString());
    //[INFO] [China,  Japan, American ,  France ]
    lists = Splitter.on(";").omitEmptyStrings().trimResults().splitToList(s);
    log.info(lists.toString());
    //[INFO] [China, Japan, American, France]
}
 | 
三、字符匹配器[CharMatcher]
一个CharMatcher代表一类字符。CharMatcher之间可以通过逻辑运算实现交、并、非。
| 方法 | 描述 | 
|---|
| CharMatcher.any() | 匹配所有字符的匹配器 | 
| CharMatcher.anyOf(CharSequence sequence) | 匹配sequence中所有字符的匹配器 | 
| CharMatcher.ascii() | ascii码的匹配器 | 
| CharMatcher.breakingWhitespace() | 可换行的空白字符的匹配器( | 
| CharMatcher.forPredicate(Predicate<? super Character> predicate) | 基于lambda表达式的匹配器,Predicate用于分配lambda表达式 | 
| CharMatcher.inRange(char startInclusive, char endInclusive) | [startInclusive, endInclusive]间所有字符的匹配器 | 
| CharMatcher.is(char match) | 单字符匹配器 | 
| CharMatcher.isNot(char match) | 除此单字符的匹配器 | 
| CharMatcher.javaIsoControl() | Java控制字符匹配器,\t \n \r | 
| CharMatcher.none() | 无字符的匹配器,匹配不到任何字符 | 
| CharMatcher.noneOf(CharSequence sequence) | 除sequence中字符外,其他字符都匹配的匹配器 | 
| CharMatcher.whitespace() | 空格匹配器 | 
| and(CharMatcher other) | 并 | 
| or(CharMatcher other) | 交 | 
| negate() | 非 | 
| matchesAnyOf(CharSequence sequence) | 匹配器匹配到sequence中任一字符 | 
| matchesAllOf(CharSequence sequence) | 匹配器匹配到sequence中所有字符 | 
| matchesNoneOf(CharSequence sequence) | 匹配器未匹配到sequence中任一字符 | 
| indexIn(CharSequence sequence) | 第一个匹配到的index,无匹配则-1 | 
| indexIn(CharSequence sequence, int start) | 从start开始,第一个匹配到的index,无匹配则-1 | 
| lastIndexIn(CharSequence sequence) | 最后一个匹配到的index,无匹配则-1 | 
| countIn(CharSequence sequence) | 匹配器从sequence中匹配到的字符数量 | 
| removeFrom(CharSequence sequence) | 从sequence中去除匹配器中的字符 | 
| retainFrom(CharSequence sequence) | 从sequence中保留匹配器中的字符 | 
| replaceFrom(CharSequence sequence, char replacement) | 用replacement代替匹配到的字符 | 
| replaceFrom(CharSequence sequence, CharSequence replacement) | 用replacement代替匹配到的字符 | 
| trimFrom(CharSequence sequence) | 删除首尾匹配到的字符 | 
| trimLeadingFrom(CharSequence sequence) | 删除首部匹配到的字符 | 
| trimTrailingFrom(CharSequence sequence) | 删除尾部匹配到的字符 | 
| collapseFrom(CharSequence sequence, char replacement) | 连续匹配到的字符,用replacement代替 | 
| trimAndCollapseFrom(CharSequence sequence, char replacement) | 删除首尾匹配到的字符,中间连续匹配到的字符用replacement代替 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  | @Test
public void charMatcherTest() {
    String input = "";
    String result = "";
    input = "H*el.lo,}12";
    CharMatcher matcher0 = CharMatcher.forPredicate(Character::isLetter);
    CharMatcher matcher1 = CharMatcher.forPredicate(Character::isLowerCase);
    result = matcher0.and(matcher1).retainFrom(input);
    assertEquals("ello", result);
    input = "H*el.lo,}12";
    CharMatcher matcher = CharMatcher.anyOf("Hel");
    result = matcher.retainFrom(input);
    assertEquals("Hell", result);
    result = matcher.removeFrom(input);
    assertEquals("*.o,}12", result);
    input = "       hel    lo      ";
    result = CharMatcher.is(' ').collapseFrom(input, '-');
    assertEquals("-hel-lo-", result);
    result = CharMatcher.is(' ').trimAndCollapseFrom(input, '-');
    assertEquals("hel-lo", result);
}
 | 
四、字符集[Charsets]
Charsets针对所有Java平台都要保证支持的六种字符集提供了常量引用。尝试使用这些常量,而不是通过名称获取字符集实例。
| 方法 | 描述 | 
|---|
| Charsets.ISO_8859_1 |   | 
| Charsets.US_ASCII |   | 
| Charsets.UTF_8 |   | 
| Charsets.UTF_16 |   | 
| Charsets.UTF_16BE |   | 
| Charsets.UTF_16LE |   | 
格式器对字符串进行大小写格式化。
| 方法 | 描述 | 
|---|
| LOWER_CAMEL | 小驼峰,lowerCamel,方法名 | 
| UPPER_CAMEL | 大驼峰,LowerCamel,类名 | 
| LOWER_HYPHEN | 小写+连字符,lower-hyphen | 
| LOWER_UNDERSCORE | 小写+下划线,C++变量名 | 
| UPPER_UNDERSCORE | 大写+下划线,常量名 | 
| to(CaseFormat format, String str) | 将str从当前格式专为目标格式 | 
| converterTo(CaseFormat targetFormat) | 返回当前格式到目标格式的转换器 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  | @Test
public void caseFormatTest() {
    String input = "";
    String result = "";
    Converter<String, String> camelConverter = CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.UPPER_UNDERSCORE);
    input = "lowerCamel";
    result = camelConverter.convert(input);
    assertEquals("LOWER_CAMEL", result);
    input = "UPPER_UNDERSCORE";
    result = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, input);
    assertEquals("UpperUnderscore", result);
}
 |