发布于2026-07-19 阅读(0)
扫一扫,手机访问
在日常 Ja va 开发里,字符串操作几乎是每天都要打交道的活儿。JDK 自带的那些工具类怎么说呢,功能有是有,但遇到稍微复杂点的场景,写出来的代码就变得又长又啰嗦。这时候 Gua va 就派上用场了——作为 Google 开源的核心 Ja va 库,它提供了一套极其顺手、高效且功能完备的字符串工具集,能让你从一堆模板代码里解放出来。下面咱们就挨个拆解 Gua va 里的核心字符串 API,看看它们到底好在哪、怎么用。
Gua va 的 com.google.common.base 包下面藏着大量实用的字符串处理工具,覆盖了空值处理、字符匹配、分割拼接、格式转换等常见场景。和 JDK 原生 API 比起来,它的优势相当明显:调用方式更简洁,能少写不少模板代码;边界处理更健壮,比如空值和空字符串都给你考虑好了;而且很多功能设计得更贴合实际业务需求,比如那些现成的字符匹配规则。
Strings 类专门解决那些最基础但也最烦人的问题——空值和空字符串。
空值/空字符串处理
比如你要判断一个字符串是不是 null 或者空串,JDK 里得写 s == null || s.isEmpty(),用 Strings.isNullOrEmpty() 一句话搞定。还有 nullToEmpty() 和 emptyToNull(),一个把 null 转成空串,一个反过来,干净利落。padStart() 和 padEnd() 则用来补全字符串到固定长度,比如左补空格或指定字符:
// 输出 " abc"(左补2个空格至长度5)
String padded = Strings.padStart("abc", 5, ' ');
// 输出 "abc "(右补2个空格至长度5)
String paddedEnd = Strings.padEnd("abc", 5, ' ');
如果说要选 Gua va 字符串处理里最核心的工具,那非 CharMatcher 莫属。你可以把它理解成一个“字符级别的正则表达式”,但性能更好、写法更直观。
内置常用匹配器
Gua va 已经给你预制了一大堆开箱即用的匹配器,覆盖绝大多数场景:WHITESPACE(空白字符)、DIGIT(数字)、LETTER(字母)、ASCII(ASCII 字符),还有 is() 匹配单个字符、inRange() 匹配字符范围等等。
核心操作
保留匹配字符:retainFrom()
// 提取字符串中的所有数字,输出 "12345"
String digits = CharMatcher.DIGIT.retainFrom("abc123def45");
移除匹配字符:removeFrom()
// 移除所有空白字符,输出 "helloworld"
String noWhitespace = CharMatcher.WHITESPACE.removeFrom("hello world\n");
替换匹配字符:replaceFrom()
// 将所有制表符替换为空格,输出 "hello world"
String replaced = CharMatcher.TAB.replaceFrom("hello\t\tworld", ' ');
修剪匹配字符:trimFrom()(首尾)、trimLeadingFrom()(开头)、trimTrailingFrom()(结尾)
// 移除首尾数字,输出 "abc"
String trimmed = CharMatcher.DIGIT.trimFrom("123abc456");
组合匹配器
更复杂的规则可以用 and()、or()、negate() 来组合:
// 匹配「非字母且非数字」的字符,输出 "!@#"
CharMatcher nonLetterDigit = CharMatcher.LETTER.or(CharMatcher.DIGIT).negate();
String specialChars = nonLetterDigit.retainFrom("abc123!@#def456");
JDK 自带的 String.split() 用起来槽点不少:空字符串莫名其妙就丢了、正则表达式还得小心陷阱。Gua va 的 Splitter 则让你对分割过程有完全的控制。
基础用法
// 按逗号分割,自动忽略空字符串,输出 ["a", "b", "c"] Listsplit = Splitter.on(',') .omitEmptyStrings() // 忽略空元素 .trimResults() // 去除每个元素的空白 .splitToList("a,, b ,c");
核心特性
on(char separator):按单个字符分割on(String separator):按字符串分割onPattern(String regex):按正则表达式分割limit(int limit):限制结果数量fixedLength(int length):按固定长度分割比如按固定长度分割字符串:
// 输出 ["abc", "def", "g"] ListfixedSplit = Splitter.fixedLength(3).splitToList("abcdefg");
拼接集合或数组的时候,最烦的就是处理 null 和分隔符。用 Joiner 一切变得清爽。
基础用法
// 拼接列表,输出 "a,b,c"
String joined = Joiner.on(',')
.skipNulls() // 跳过 null 元素
.join(Arrays.asList("a", null, "b", "c"));
// 替换 null 元素,输出 "a,空,b,c"
String joinedWithNull = Joiner.on(',').useForNull("空").join(Arrays.asList("a", null, "b", "c"));
拼接 Map
// 输出 "k1=v1,k2=v2" Mapmap = ImmutableMap.of("k1", "v1", "k2", "v2"); String mapJoined = Joiner.on(',').withKeyValueSeparator('=').join(map);
不同命名规范之间的转换(驼峰、下划线、连字符)也是家常便饭,CaseFormat 就是干这个的。
常用格式枚举
LOWER_CAMEL:小驼峰(lowerCamel)UPPER_CAMEL:大驼峰(UpperCamel)LOWER_UNDERSCORE:下划线小写(lower_underscore)UPPER_UNDERSCORE:下划线大写(UPPER_UNDERSCORE)LOWER_HYPHEN:连字符小写(lower-hyphen)转换示例
// 下划线转小驼峰,输出 "helloWorld" String camel = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "hello_world"); // 小驼峰转连字符,输出 "hello-world" String hyphen = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, "helloWorld");
Ascii 专注于 ASCII 字符的大小写转换和校验,比 JDK 的 Character 更高效,因为不用操心 Unicode:
// ASCII 小写转大写,输出 "HELLO"
String upper = Ascii.toUpperCase("hello");
// 校验是否为 ASCII 可打印字符
boolean isPrintable = Ascii.isPrintable('a');
假设你要过滤用户输入的昵称,只保留字母、数字和下划线,其他字符替换成下划线,并且首尾不能有空白。
String nickname = " 张三123!@#_test ";
// 1. 去除首尾空白 2. 非字母/数字/下划线替换为下划线 3. 合并连续下划线
String cleaned = CharMatcher.WHITESPACE.trimFrom(nickname);
cleaned = CharMatcher.JA VA_LETTER_OR_DIGIT.or(CharMatcher.is('_'))
.negate()
.replaceFrom(cleaned, '_');
cleaned = CharMatcher.is('_').collapseFrom(cleaned, '_');
// 输出 "张三123_test"(中文不在 ASCII 范围内,CharMatcher.JA VA_LETTER 包含中文)
比如你有一个形如 key1=value1;key2=value2;key3=value3 的配置字符串,要解析成 Map,还要忽略空行和 # 开头的注释行。
String config = "# 配置示例\nkey1=value1;;key2=value2;key3=value3"; MapconfigMap = Splitter.on(';') .omitEmptyStrings() .trimResults() .splitToStream(config) .filter(line -> !line.startsWith("#")) .map(line -> Splitter.on('=').limit(2).splitToList(line)) .collect(Collectors.toMap( list -> list.get(0), list -> list.size() > 1 ? list.get(1) : "" )); // 输出 {key1=value1, key2=value2, key3=value3}
依赖引入:在 Ma ven 项目里添加 Gua va 依赖,推荐用最新稳定版:
com.google.gua va gua va 32.1.3-jre
如果是 Android 项目,记得换成 gua va:32.1.3-android。
空值处理:Gua va 大多数工具对 null 都挺友好,但 Splitter 和 Joiner 默认不会自动处理 null,需要显式调用 skipNulls() 或 useForNull()。
性能考量:CharMatcher 是不可变的,预定义的匹配器(比如 DIGIT、WHITESPACE)可以反复用,不用担心重复创建的开销。
Gua va 的字符串工具类通过封装高频场景、加强边界处理,让 Ja va 字符串操作变得更高效、更易读。从基础的 Strings 到灵活的 CharMatcher,再到可控的 Splitter 和 Joiner,几乎覆盖了日常开发里你能遇到的所有字符串处理需求。和原生 JDK API 一比,Gua va 写出来的代码不仅更短,还更健壮——确实是 Ja va 开发者不可或缺的效率提升利器。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8