1. 概述

在这个简短教程中,我们将介绍如何使用Java对特定字符串中的每个单词首字母进行大写转换。

首先,我们会解释如何使用Java开发工具包(JDK)内置的解决方案。接着,我们将演示如何借助Apache Commons等外部库来实现相同的结果。

2. 问题介绍

目标是将给定字符串中每个单词的第一个字母转换为大写。例如,假设我们有一个输入字符串:

String input = "Hi my name is azhrioun";

那么,我们期望输出的结果是每个单词都以大写字母开头:

String output = "Hi My Name Is Azhrioun";

解决这个问题的基本思路是将输入字符串分割成多个单词。然后,我们可以利用不同的方法和类来对每个返回的单词的首字母进行大写处理。

现在让我们深入了解每种方法。

3. 使用 Character#toUpperCase

toUpperCase()方法提供了一种最直接的方式来实现我们的目标。顾名思义,这个方法将给定的字符转换为大写。

以下是使用它来转换字符串中每个单词首字母的示例:

static String usingCharacterToUpperCaseMethod(String input) {
    if (input == null || input.isEmpty()) {
        return null;
    }

    return Arrays.stream(input.split("\\s+"))
      .map(word -> Character.toUpperCase(word.charAt(0)) + word.substring(1))
      .collect(Collectors.joining(" "));
}

首先,我们检查输入字符串是否为null或空,以防出现潜在的NullPointerException。然后,我们使用split()方法将输入字符串划分为多个单词。

接着,我们使用charAt(0)获取每个单词的第一个字符,然后应用toUpperCase()将其转换为大写。之后,我们使用+操作符将大写的字符与单词剩余部分连接起来,并使用substring(1)获取剩余部分。最后,我们使用Collectors#joining将每个大写单词重新组合成一个字符串。

现在,让我们为我们的方法添加一个测试用例:

@Test
void givenString_whenUsingCharacterToUpperCaseMethod_thenCapitalizeFirstCharacter() {
    String input = "hello baeldung visitors";

    assertEquals("Hello Baeldung Visitors", CapitalizeFirstCharacterEachWordUtils.usingCharacterToUpperCaseMethod(input));
}

4. 使用 String#toUpperCase

String类提供了自己的toUpperCase()方法。让我们用String#toUpperCase重写之前的例子:

static String usingStringToUpperCaseMethod(String input) {
    return Arrays.stream(input.split("\\s+"))
      .map(word -> word.substring(0, 1).toUpperCase() + word.substring(1))
      .collect(Collectors.joining(" "));
}

如上所示,我们使用substring(0, 1)提取每个单词的第一个字符作为String,然后调用toUpperCase()方法将其转换为大写。随后,我们使用之前的方法来连接和合并返回的单词。

让我们为这种方法编写一个测试:

@Test
void givenString_whenUsingSubstringMethod_thenCapitalizeFirstCharacter() {
    String input = "Hi, my name is azhrioun";

    assertEquals("Hi, My Name Is Azhrioun", CapitalizeFirstCharacterEachWordUtils.usingStringToUpperCaseMethod(input));
}

请注意,与String#toUpperCase不同,Character#toUpperCase是一个静态方法。另一个关键区别是String#toUpperCase会产生一个新的String,而Character#toUpperCase返回一个新char基本类型。

5. 使用 Apache Commons Lang3 的 StringUtils

另一种选择是使用Apache Commons Lang3库来处理我们的核心问题。首先,我们需要将其依赖项添加到pom.xml文件中:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version>
</dependency>

此库提供了StringUtils类,可以安全地处理和操作字符串。

接下来,让我们看看如何使用这个实用类来对特定字符串中的每个单词进行大写处理:

static String usingStringUtilsClass(String input) {
    return Arrays.stream(input.split("\\s+"))
      .map(StringUtils::capitalize)
      .collect(Collectors.joining(" "));
}

这里,我们使用了capitalize()方法,顾名思义,它将第一个字符转换为大写,而其余字符保持不变。

最后,我们通过新的测试用例确认我们的方法是否正常工作:

@Test
void givenString_whenUsingStringUtilsClass_thenCapitalizeFirstCharacter() {
    String input = "life is short the world is wide";

    assertEquals("Life Is Short The World Is Wide", CapitalizeFirstCharacterEachWordUtils.usingStringUtilsClass(input));
}

6. 使用 Apache Commons Text 的 WordUtils

另一个解决方案是使用Apache Commons Text库。无需多言,我们现在将它的依赖项添加到pom.xml文件中:

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

通常,这个库包含一组现成的用于字符串操作的类和方法。其中,WordUtils类尤其适用。

WordUtils#capitalizeFully方法提供了处理我们问题最简洁直接的方式。这个方法将所有由空格分隔的单词转换为全大写单词。

请注意,此方法能优雅地处理null输入,所以我们不需要检查输入字符串是否为null

现在,让我们添加另一个测试用例,确保一切按预期工作:

@Test
void givenString_whenUsingWordUtilsClass_thenCapitalizeFirstCharacter() {
    String input = "smile sunshine is good for your teeth";

    assertEquals("Smile Sunshine Is Good For Your Teeth", WordUtils.capitalizeFully(input));
}

7. 总结

在这篇简短的文章中,我们探讨了在Java中使用各种方法将给定字符串中每个单词的首字母大写的方法。

首先,我们讲解了使用JDK的方法。然后,我们展示了如何使用第三方库来解答核心问题。

本文中的代码可以在GitHub找到。