在 java 开发中,字符串操作是日常开发高频场景,但 jdk 原生的字符串工具类功能相对基础,处理复杂场景时往往需要编写大量冗余代码。google 开源的 guava 库为字符串操作提供了一套简洁、高效且功能丰富的工具集,本文将深入解析 guava 中核心的字符串操作 api,结合场景讲解其用法与优势。
一、guava 字符串工具概述
guava 作为 google 核心 java 库,其 com.google.common.base 包下封装了大量字符串处理工具,涵盖字符串空值处理、字符匹配、分割拼接、格式转换等核心场景,相比 jdk 原生 api:
- 更简洁的调用方式,减少模板代码;
- 更健壮的边界处理(如空值、空字符串);
- 更贴合业务场景的功能设计(如固定规则的字符匹配、分割)。
二、核心 api 详解
1. strings:基础字符串工具
strings 类聚焦于最常用的字符串基础操作,解决空值、空字符串处理的痛点。
空值/空字符串处理
strings.isnullorempty(charsequence s):判断字符串是否为 null 或空字符串(""),替代 jdk 中 s == null || s.isempty() 的冗余写法;
strings.nulltoempty(charsequence s):将 null 转换为空字符串,非 null 则返回原字符串;
strings.emptytonull(charsequence s):将空字符串转换为 null,非空则返回原字符串;
strings.padstart/strings.padend:字符串补全,如左补空格/指定字符至固定长度,示例:
// 输出 " abc"(左补2个空格至长度5)
string padded = strings.padstart("abc", 5, ' ');
// 输出 "abc "(右补2个空格至长度5)
string paddedend = strings.padend("abc", 5, ' ');
2. charmatcher:灵活的字符匹配器
charmatcher 是 guava 字符串处理的核心工具,用于筛选、匹配、替换字符,可理解为「字符级别的正则表达式」,且性能更优。
内置常用匹配器
guava 预定义了大量开箱即用的 charmatcher,覆盖绝大多数场景:
charmatcher.whitespace:匹配所有空白字符(空格、制表符、换行等);charmatcher.digit:匹配数字字符;charmatcher.letter:匹配字母;charmatcher.ascii:匹配 ascii 字符;charmatcher.is(char c):匹配指定单个字符;charmatcher.inrange(char start, char end):匹配指定范围的字符。
核心操作
保留匹配字符:retainfrom(charsequence s)
// 提取字符串中的所有数字,输出 "12345"
string digits = charmatcher.digit.retainfrom("abc123def45");
移除匹配字符:removefrom(charsequence s)
// 移除所有空白字符,输出 "helloworld"
string nowhitespace = charmatcher.whitespace.removefrom("hello world\n");
替换匹配字符:replacefrom(charsequence s, char replacement)
// 将所有制表符替换为空格,输出 "hello world"
string replaced = charmatcher.tab.replacefrom("hello\t\tworld", ' ');
修剪匹配字符:trimfrom(charsequence s)(首尾)、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");
3. splitter:灵活的字符串分割
jdk 原生 string.split() 存在诸多痛点(如空字符串丢失、正则表达式陷阱),guava splitter 提供了更可控的分割能力。
基础用法
// 按逗号分割,自动忽略空字符串,输出 ["a", "b", "c"]
list<string> split = 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"]
list<string> fixedsplit = splitter.fixedlength(3).splittolist("abcdefg");
4. joiner:字符串拼接
joiner 解决了 jdk 中拼接集合/数组时「空值处理」「分隔符拼接」的痛点。
基础用法
// 拼接列表,输出 "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"
map<string, string> map = immutablemap.of("k1", "v1", "k2", "v2");
string mapjoined = joiner.on(',').withkeyvalueseparator('=').join(map);
5. caseformat:大小写格式转换
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");
6. ascii:ascii 字符处理
ascii 类专注于 ascii 字符的大小写转换、校验,相比 jdk character 更高效(无需处理 unicode):
// ascii 小写转大写,输出 "hello"
string upper = ascii.touppercase("hello");
// 校验是否为 ascii 可打印字符
boolean isprintable = ascii.isprintable('a');
三、实战场景示例
场景 1:清洗用户输入
需求:过滤用户输入的昵称,仅保留字母、数字和下划线,其余字符替换为下划线,且首尾无空白。
string nickname = " 张三123!@#_test ";
// 1. 去除首尾空白 2. 非字母/数字/下划线替换为下划线 3. 合并连续下划线
string cleaned = charmatcher.whitespace.trimfrom(nickname);
cleaned = charmatcher.java_letter_or_digit.or(charmatcher.is('_'))
.negate()
.replacefrom(cleaned, '_');
cleaned = charmatcher.is('_').collapsefrom(cleaned, '_');
// 输出 "张三123_test"(注:中文不在 ascii 范围内,charmatcher.java_letter 包含中文)
场景 2:解析配置字符串
需求:解析形如 key1=value1;key2=value2;key3=value3 的配置字符串为 map,忽略空行和注释行(以 # 开头)。
string config = "# 配置示例\nkey1=value1;;key2=value2;key3=value3";
map<string, string> configmap = 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}
四、使用注意事项
依赖引入:确保项目中引入 guava 依赖(maven 示例):
<dependency>
<groupid>com.google.guava</groupid>
<artifactid>guava</artifactid>
<version>32.1.3-jre</version> <!-- 最新版本可参考 guava 官方仓库 -->
</dependency>若为 android 项目,使用 guava:32.1.3-android 版本。
空值处理:guava 工具类对 null 大多做了友好处理,但需注意 splitter/joiner 默认不处理 null,需显式调用 skipnulls()/usefornull()。
性能考量:charmatcher 是不可变类,预定义的匹配器(如 digit/whitespace)可复用,避免重复创建。
五、总结
guava 的字符串工具类通过封装高频场景、优化边界处理,大幅提升了 java 字符串操作的效率和可读性。从基础的空值处理(strings)到灵活的字符匹配(charmatcher),再到可控的分割/拼接(splitter/joiner),几乎覆盖了日常开发中所有字符串处理需求。相比原生 jdk api,guava 让代码更简洁、更健壮,是 java 开发者提升效率的必备工具。
以上就是一文详解java guava核心字符串api操作的实用指南的详细内容,更多关于java guava字符串操作的资料请关注代码网其它相关文章!
发表评论