1. 概述

本文我们将学习如何将字符串转换为驼峰式命名法。

2.Java原生实现

驼峰式命名法(Camel case)是一种不使用空格的书写方式,通过将每个单词的首字母大写来连接多个单词。

驼峰又分为两种类型:

  • 小驼峰式,第一个单词的第一个字符为小写(常用)
  • 大驼峰式,第一个单词的第一个字符为大写:
thisIsLowerCamelCase
ThisIsLowerCamelCase

本文,我们将重点关注转换为小驼峰式

2.1.正则表达式(Regex)

我们可以使用正则表达式将包含单词的字符串拆分为数组:

String[] words = text.split("[\\W_]+");

我们通过空格、下划线等分隔符将字符串拆分为单词,然后重新组装为驼峰式:

StringBuilder builder = new StringBuilder();
for (int i = 0; i < words.length; i++) {
    String word = words[i];
    if (i == 0) {
        word = word.isEmpty() ? word : word.toLowerCase();
    } else {
        word = word.isEmpty() ? word : Character.toUpperCase(word.charAt(0)) + word.substring(1).toLowerCase();      
    }
    builder.append(word);
}
return builder.toString();

在这里,我们将数组中的第一个单词转换为小写。对于数组中的每个其他单词,我们将第一个字符转换为大写,其余字符转换为小写。

下面测试:

// 空格分隔的大写字母 转为 驼峰式
assertThat(toCamelCaseByRegex("THIS STRING SHOULD BE IN CAMEL CASE"))
  .isEqualTo("thisStringShouldBeInCamelCase");
// 下划线 转为 驼峰式
assertThat(toCamelCaseByRegex("this_string_should_be_in_camel_case"))
  .isEqualTo("thisStringShouldBeInCamelCase");

这个解决方案很简单,但需要多次字符串复制。 如果输入非常大,这可能会消耗大量内存

2.2.遍历字符串

我们可以用一个循环来替换上述算法,该循环在每个字符通过原始字符串时计算出每个字符的正确大小写。这会跳过任何分隔符并一次将一个字符写入 StringBuilder

首先,我们需要跟踪转换的状态:

boolean shouldConvertNextCharToLower = true;

然后我们迭代源文本,跳过或适当地大写每个字符:

for (int i = 0; i < text.length(); i++) {
    char currentChar = text.charAt(i);
    if (currentChar == delimiter) {
        shouldConvertNextCharToLower = false;
    } else if (shouldConvertNextCharToLower) {
        builder.append(Character.toLowerCase(currentChar));
    } else {
        builder.append(Character.toUpperCase(currentChar));
        shouldConvertNextCharToLower = true;
    }
}
return builder.toString();

这里的 delimiter 是单词分隔符。

例如使用空格作为分隔符:

assertThat(toCamelCaseByIteration("THIS STRING SHOULD BE IN CAMEL CASE", ' '))
  .isEqualTo("thisStringShouldBeInCamelCase");

使用下划线分隔符:

assertThat(toCamelCaseByIteration("THIS_STRING_SHOULD_BE_IN_CAMEL_CASE", '_'))
  .isEqualTo("thisStringShouldBeInCamelCase");

3.使用第三方库

3.1.使用Apache

使用Apache Commons Text ,首先添加Maven依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.9</version>
</dependency>

该库在 CaseUtils 中提供了 toCamelCase 方法:

String camelCase = CaseUtils.toCamelCase(text, false, delimiter);

让我们尝试一下:

assertThat(CaseUtils.toCamelCase("THIS STRING SHOULD BE IN CAMEL CASE", false, ' '))
  .isEqualTo("thisStringShouldBeInCamelCase");

为了将字符串转换为标题大小写或大驼峰大小写,我们需要将 true 传递给 toCamelCase 方法:

String camelCase = CaseUtils.toCamelCase(text, true, delimiter);

让我们尝试一下:

assertThat(CaseUtils.toCamelCase("THIS STRING SHOULD BE IN CAMEL CASE", true, ' '))
  .isEqualTo("ThisStringShouldBeInCamelCase");

3.2.使用Guava

通过一些预处理,我们可以通过Guava将字符串转换为驼峰。

要使用 Guava,我们将其依赖项添加到我们的项目中:

<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>31.0.1-jre</version>
</dependency>

Guava 有一个实用程序类 CaseFormat ,用于格式转换:

String camelCase = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "THIS_STRING_SHOULD_BE_IN_CAMEL_CASE");

大写字母下划线,转小驼峰式:

assertThat(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "THIS_STRING_SHOULD_BE_IN_CAMEL_CASE"))
  .isEqualTo("thisStringShouldBeInCamelCase");

如果我们的字符串已经采用这种格式,那就没问题了。但是,如果我们希望使用不同的分隔符并处理混合情况,我们需要预处理我们的输入:

String toUpperUnderscore = "This string should Be in camel Case"
  .toUpperCase()
  .replaceAll(' ', "_");

首先,我们将给定的字符串转换为大写。然后,我们用下划线替换所有分隔符。生成的格式与 Guava 的 CaseFormat.UPPER_UNDERSCORE 等效。 现在我们可以使用 Guava 来生成驼峰版本:

assertThat(toCamelCaseUsingGuava("THIS STRING SHOULD BE IN CAMEL CASE", " "))
  .isEqualTo("thisStringShouldBeInCamelCase");

4。结论

在本教程中,我们学习了如何将字符串转换为驼峰式大小写。

首先,我们构建了一种将字符串拆分为单词的算法。然后我们构建了一个迭代每个字符的算法。

最后,我们研究了如何使用一些第三方库来实现结果。 Apache Commons Text 非常接近我们的需求,Guava 在进行一些预处理后可以帮助我们。

惯例,完整的源代码可以在 GitHub 上获取。