Java中字符串的第一个字母大写

评论 0 浏览 0 2022-10-20

1. 概述

Java标准库提供了String.toUpperCase()方法,它允许我们转换字符串中的所有字母为大写。

在本教程中,我们将学习如何将给定字符串的第一个字符转换为大写。

2.问题介绍

一个例子可以快速解释这个问题。假设我们有一个输入字符串:

String INPUT = "hi there, Nice to Meet You!";

给定这个 INPUT 字符串,这是我们的预期结果:

String EXPECTED = "Hi there, Nice to Meet You!";

正如我们所看到的,我们只想将第一个字符“h”更改为“H”。但是,不应修改其余字符

当然,如果输入字符串为空,结果也应该是空字符串:

String EMPTY_INPUT = "";
String EMPTY_EXPECTED = "";

在本教程中,我们将讨论该问题的几种解决方案。为简单起见,我们将使用单元测试断言来验证我们的解决方案是否按预期运行。

3. 使用substring()方法

解决该问题的第一个想法是将输入字符串拆分为两个子字符串。例如,我们可以将 INPUT 字符串拆分为“h”和“i there, Nice ....”。换句话说,第一个子字符串仅包含第一个字符,另一个子字符串包含字符串的其余字符。

然后,我们可以在第一个子字符串上应用toUpperCase()方法并连接第二个子字符串来解决问题

Java的String类的substring()方法可以帮助我们获取两个子字符串:

  • INPUT.substring(0, 1) – 包含第一个字符的子字符串 1
  • INPUT.substring(1) – 子字符串 2 包含其余字符

接下来,让我们编写一个测试来看看该解决方案是否有效:

String output = INPUT.substring(0, 1).toUpperCase() + INPUT.substring(1);
assertEquals(EXPECTED, output);

如果我们运行测试,它就会通过。但是,如果我们的输入是空字符串,则此方法将引发IndexOutOfBoundsException。这是因为当我们调用 INPUT.substring(1) 时,结束索引 (1) 大于空字符串的长度 (0) :

assertThrows(IndexOutOfBoundsException.class, () -> EMPTY_INPUT.substring(1));

此外,我们应该注意,如果输入字符串为null,此方法将抛出NullPointerException

因此,在使用子字符串方法之前,我们需要检查并确保输入字符串不为null或空

4. 使用 Matcher.replaceAll() 方法

解决该问题的另一个想法是使用 regex (“^.”) 匹配第一个字符并将匹配组转换为大写。

在 Java 9 之前这并不是一件容易的事。这是因为 Matcher 的替换方法,例如 replaceAll()replaceFirst() 不支持 Function 对象或 lambda 表达式替换器。然而,这种情况在 Java 9 中发生了变化。

从Java 9开始,Matcher的替换方法支持Function对象作为替换器。也就是说,我们可以使用函数来处理匹配的字符序列并完成替换。当然,要解决我们的问题,我们只需要对匹配的字符调用 toUpperCase() 方法即可:

String output = Pattern.compile("^.").matcher(INPUT).replaceFirst(m -> m.group().toUpperCase());
assertEquals(EXPECTED, output);

如果我们运行一下,测试就会通过。

如果正则表达式没有匹配任何内容,则不会发生替换。因此,此解决方案也适用于空输入字符串

String emptyOutput = Pattern.compile("^.").matcher(EMPTY_INPUT).replaceFirst(m -> m.group().toUpperCase());
assertEquals(EMPTY_EXPECTED, emptyOutput);

值得一提的是,如果输入字符串为null,该解决方案也会抛出NullPointerException。因此,我们在使用它之前仍然需要进行null检查。

5. 使用 Apache Commons Lang 3 中的 StringUtils

Apache Commons Lang3 是一个流行的库。它附带了许多方便的实用程序类,并扩展了标准 Java 库的功能。

它的 StringUtils 类提供了 capitalize() 方法,该方法直接解决了我们的问题。

要使用该库,我们首先添加 Maven 依赖项

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

然后,像往常一样,让我们​​创建一个测试来看看它是如何工作的:

String output = StringUtils.capitalize(INPUT);
assertEquals(EXPECTED, output);

如果我们执行它,测试就会通过。正如我们所看到的,我们只需调用StringUtils.capitalize(INPUT)。 然后该库会为我们完成这项工作。

值得一提的是,StringUtils.capitalize() 方法是 null 安全的,并且也适用于空输入字符串

String emptyOutput = StringUtils.capitalize(EMPTY_INPUT);
assertEquals(EMPTY_EXPECTED, emptyOutput);
String nullOutput = StringUtils.capitalize(null);
assertNull(nullOutput);

六,结论

在本文中,我们学习了如何将给定字符串的第一个字符转换为大写。

与往常一样,本文中使用的完整代码 在 GitHub 上

最后更新2024-03-25
0 个评论