Google Guava 字符串工具使用详解

2023-12-05


字符串工具

工具类 描述
Strings 用于对字符串进行各种操作,例如判空、拼接、截取、填充等
Joiner 用于将多个元素连接成一个字符串,并且可以指定连接符和处理null值的方式
Splitter 用于将一个字符串分割成多个部分,可以指定分隔符和分割结果的处理方式
CharMatcher 用于对字符进行匹配和操作
CaseFormat 用于不同命名格式之间的转换,例如驼峰命名、大写下划线命名、小写连字符命名等

- Strings

Strings类提供了一系列静态方法,用于对字符串进行各种操作,例如判空、拼接、截取、填充等。

主要方法:

方法 描述
isNullOrEmpty(String) 判断字符串是否为null或空字符串。
emptyToNull(String) 将空字符串转换为null。
nullToEmpty(String) 将null转换为空字符串。
repeat(String, int) 指定字符串重复次数。
padStart(String, int, char) 在字符串的开头填充指定字符到指定长度。
padEnd(String, int, char) 在字符串的结尾填充指定字符到指定长度。
commonPrefix(CharSequence, CharSequence) 获取两个字符串的最长公共前缀。
commonSuffix(CharSequence, CharSequence) 获取两个字符串的最长公共后缀。

使用示例:

    public static void main(String[] args) {
        boolean b1 = Strings.isNullOrEmpty("");
        System.out.println("字符串是否为null或空字符串:" +b1);

        String b2 = Strings.emptyToNull("aa");
        System.out.println("将空字符串转换为null:" +b2);

        String b3 = Strings.emptyToNull("");
        System.out.println("将空字符串转换为null:" +b3);

        String b4 = Strings.repeat("123", 5);
        System.out.println("指定字符串重复次数:" +b4);

        String b5 = Strings.padStart("99", 5, '0');
        System.out.println("在字符串的开头填充指定字符到指定长度:" +b5);

        String b6 = Strings.padEnd("99", 5, '0');
        System.out.println("在字符串的结尾填充指定字符到指定长度:" +b6);

        String b7 = Strings.commonPrefix("abc666", "ab1555");
        System.out.println("获取两个字符串的最长公共前缀:" +b7);

        String b8 = Strings.commonSuffix("sds", "dfh345sds");
        System.out.println("获取两个字符串的最长公共后缀:" +b8);
    }

日志

字符串是否为null或空字符串:true
将空字符串转换为null:aa
将空字符串转换为nullnull
指定字符串重复次数:123123123123123
在字符串的开头填充指定字符到指定长度:00099
在字符串的结尾填充指定字符到指定长度:99000
获取两个字符串的最长公共前缀:ab
获取两个字符串的最长公共后缀:sds

- Joiner

Joiner类用于将多个元素连接成一个字符串,并且可以指定连接符和处理null值的方式。

主要方法:

方法 描述
on(char) 指定分隔符。
join(Iterable) 将可迭代对象中的元素连接成一个字符串。
join(Object[]) 将对象数组连接成一个字符串。
join(Object…) 将多个对象连接成一个字符串。
skipNulls() 忽略null值。
useForNull(String) 指定在连接过程中将null值替换为指定字符串。

使用示例:

    public static void main(String[] args) {
        String s1 = Joiner.on(",").join(Arrays.asList("A", "B", "C"));
        System.out.println("将可迭代对象中的元素连接成一个字符串:"+s1);

        String s2 = Joiner.on(",").join(Stream.of("A", "B", "C").toArray());
        System.out.println("将数组连接成一个字符串:"+s2);

        String s3 = Joiner.on(",").join("A", "B", "C");
        System.out.println("将可变参数连接成一个字符串:"+s3);

        String s4 = Joiner.on(",").useForNull("666").join("A", "B", null, "C");
        System.out.println("连接过程将null值替换为指定字符串:"+s4);

        String s5 = Joiner.on(",").skipNulls().join("A", "B", null, "C");
        System.out.println("连接过程忽略null值:"+s5);
    }

日志

已连接到目标 VM, 地址: ''127.0.0.1:56398',传输: '套接字''
将可迭代对象中的元素连接成一个字符串:A,B,C
将数组连接成一个字符串:A,B,C
将可变参数连接成一个字符串:A,B,C
连接过程将null值替换为指定字符串:A,B,666,C
连接过程忽略null值:A,B,C

- Splitter

Splitter类用于将一个字符串分割成多个部分,可以指定分隔符和分割结果的处理方式。

主要方法:

方法 描述
on(char separator) 指定单个字符作为分隔符。
on(CharMatcher separatorMatcher) 使用 CharMatcher 指定分隔符。
on(final String separator) 指定字符串作为分隔符。
on(Pattern separatorPattern) 使用正则表达式指定分隔符进行分割。
onPattern(String separatorPattern) 使用正则表达式指定分隔符进行分割。
omitEmptyStrings() 忽略结果中的空字符串。
trimResults() 去除结果字符串的前导和尾部空白字符。
trimResults(CharMatcher trimmer) 使用 CharMatcher 去除结果字符串的前导和尾部空白字符。
limit(int) 限制分割的结果数量。
withKeyValueSeparator(String separator) 用于指定键值对的分隔符。
withKeyValueSeparator(char separator) 用于指定键值对的分隔符。
withKeyValueSeparator(Splitter keyValueSplitter) 用于指定键值对的分隔符。
split(final CharSequence sequence) 将字符序列分割为多个部分。
splitToList(CharSequence sequence) 将字符序列分割为列表形式的结果。
splitToStream(CharSequence sequence) 将字符序列分割为流形式的结果。

使用示例:

    public static void main(String[] args) {
        // 指定逗号作为分隔符,并忽略空字符串和去除前导和尾部空白字符
        String input = "apple, banana, ,orange,  ";
        Iterable<String> result = Splitter.on(',')
                .omitEmptyStrings()
                .trimResults()
                .split(input);
        for (String s : result) {
            System.out.println(s);
        }
        System.out.println("------------------------------------------");
        // 使用正则表达式作为分隔符,并将字符串分割为数字部分和非数字部分
        input = "a1b2c3d4e5";
        result = Splitter.onPattern("\\d")
                .split(input);
        for (String s : result) {
            System.out.println(s);
        }
    }

日志

apple
banana
orange
------------------------------------------
a
b
c
d
e

- CharMatcher

CharMatcher类用于对字符进行匹配和操作。

主要方法:

方法 描述
anyOf(String chars) 匹配给定字符串中的任意字符。
inRange(char startInclusive, char endInclusive) 匹配在给定范围内的字符。
is(char match) 匹配与给定字符相同的字符。
isNot(char match) 匹配与给定字符不同的字符。
whitespace() 匹配空白字符。
collapseFrom(CharSequence sequence, char replacement) 将匹配的字符替换为给定的字符。
retainFrom(CharSequence sequence) 保留匹配的字符,删除其他字符。
removeFrom(CharSequence sequence) 删除匹配的字符。
matchesAllOf(CharSequence sequence) 判断字符序列是否完全匹配 CharMatcher。
countIn(CharSequence sequence) 统计字符序列中匹配的字符数量。
trimFrom(CharSequence sequence) 删除字符序列开头和结尾的匹配字符。
trimLeadingFrom(CharSequence sequence) 删除字符序列开头的匹配字符。
trimTrailingFrom(CharSequence sequence) 删除字符序列结尾的匹配字符。
replaceFrom(CharSequence sequence, char replacement) 将匹配的字符替换为给定的字符。
trimAndCollapseFrom(CharSequence sequence, char replacement) 删除字符序列开头和结尾的匹配字符,并将连续的匹配字符替换为给定的字符。
replaceFrom(CharSequence sequence, char replacement) 将匹配的字符替换为给定的字符。
matchesNoneOf(CharSequence sequence) 判断字符序列是否没有匹配 CharMatcher。
indexIn(CharSequence sequence) 返回第一个匹配字符的索引。
indexOf(CharSequence sequence, int start) 返回从指定索引开始的第一个匹配字符的索引。
lastIndexIn(CharSequence sequence) 返回最后一个匹配字符的索引。
or(CharMatcher other) 返回一个新的 CharMatcher,其匹配条件是原始 CharMatcher 和另一个 CharMatcher 条件的逻辑或关系。
and(CharMatcher other) 返回一个新的 CharMatcher,其匹配条件是原始 CharMatcher 和另一个 CharMatcher 条件的逻辑与关系。
negate() 返回一个新的 CharMatcher,其匹配条件是原始 CharMatcher 的否定。

使用示例:

    public static void main(String[] args) {
        String testString = "abc 123 def 456 ghi 789";

        // 匹配给定字符串中的任意字符
        CharMatcher anyOfMatcher = CharMatcher.anyOf("aeiou");
        System.out.println(anyOfMatcher.removeFrom(testString)); // 输出 bc 123 df 456 gh 789

        // 匹配在给定范围内的字符
        CharMatcher inRangeMatcher = CharMatcher.inRange('a', 'f');
        System.out.println(inRangeMatcher.removeFrom(testString)); // 输出 def 456 ghi 789

        // 匹配与给定字符相同的字符
        CharMatcher isMatcher = CharMatcher.is('o');
        System.out.println(isMatcher.countIn(testString)); // 输出 0

        // 匹配与给定字符不同的字符
        CharMatcher isNotMatcher = CharMatcher.isNot(' ');
        System.out.println(isNotMatcher.removeFrom(testString)); // 输出 abc123def456ghi789

        // 匹配空白字符
        CharMatcher whitespaceMatcher = CharMatcher.whitespace();
        System.out.println(whitespaceMatcher.trimFrom(testString)); // 输出 "abc 123 def 456 ghi 789"

        // 将匹配的字符替换为给定的字符
        CharMatcher digitMatcher = CharMatcher.digit();
        System.out.println(digitMatcher.replaceFrom(testString, '*')); // 输出 "abc *** def *** ghi ***"

        // 统计字符序列中匹配的字符数量
        CharMatcher anyMatcher = CharMatcher.any();
        System.out.println(anyMatcher.countIn(testString)); // 输出 20

        // 删除字符序列开头和结尾的匹配字符
        CharMatcher trimMatcher = CharMatcher.is(' ');
        System.out.println(trimMatcher.trimFrom(testString)); // 输出 "abc 123 def 456 ghi 789"

        // 删除字符序列开头的匹配字符
        CharMatcher leadingMatcher = CharMatcher.is('a');
        System.out.println(leadingMatcher.trimLeadingFrom(testString)); // 输出 "bc 123 def 456 ghi 789"

        // 删除字符序列结尾的匹配字符
        CharMatcher trailingMatcher = CharMatcher.is('9');
        System.out.println(trailingMatcher.trimTrailingFrom(testString)); // 输出 "abc 123 def 456 ghi 78"

        // 将匹配的字符替换为给定的字符
        CharMatcher replaceMatcher = CharMatcher.anyOf("aeiou");
        System.out.println(replaceMatcher.replaceFrom(testString, '*')); // 输出 "*b*c 123 d*f 456


        // 将字符序列中的多个连续匹配字符缩减为一个字符
        CharMatcher duplicateMatcher = CharMatcher.is(' ');
        String collapsedString = duplicateMatcher.collapseFrom(testString, ' ');
        System.out.println(collapsedString); // 输出 "abc 123 def 456 ghi 789"

        // 判断字符序列是否不包含任何匹配字符
        System.out.println(whitespaceMatcher.matchesNoneOf(testString)); // 输出 false
    }

日志:

bc 123 df 456 gh 789
 123  456 ghi 789
0
     
abc 123 def 456 ghi 789
abc *** def *** ghi ***
23
abc 123 def 456 ghi 789
bc 123 def 456 ghi 789
abc 123 def 456 ghi 78
*bc 123 d*f 456 gh* 789
abc 123 def 456 ghi 789
false

- CaseFormat

CaseFormat类用于不同命名格式之间的转换,例如驼峰命名、大写下划线命名、小写连字符命名等。

CaseFormat 支持的命名约定和格式包括:

  • LOWER_CAMEL:首字母小写驼峰命名
  • UPPER_CAMEL:首字母大写驼峰命名
  • LOWER_UNDERSCORE:下划线小写命名
  • UPPER_UNDERSCORE:下划线大写命名
  • LOWER_HYPHEN:连字符小写命名

主要方法:

方法名 描述
String to(CaseFormat format, String str) 将给定格式的字符串转换为另一种格式

使用示例:

    public static void main(String[] args) {
        // 首字母小写驼峰 转换为 下划线大写
        String s1 = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, "userId");
        System.out.println(s1);

        // 下划线大写 转换为 连字符小写
        String s2 = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, "USER_ID");
        System.out.println(s2);

       // 连字符小写 转换为 首字母大写驼峰
        String s3 = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, "user-id");
        System.out.println(s3);

    }

日志

USER_ID
user-id
UserId
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Guava 字符串工具使用详解 的相关文章

  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐