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)
- 包含第一个字符的子字符串1INPUT.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()
方法
另一个解决问题的想法是使用正则表达式("^.")匹配第一个字符并将其转换为大写。
在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);
6. 总结
在这篇文章中,我们学习了如何将给定字符串的第一个字符转换为大写。
一如既往,本文使用的完整代码可以在GitHub上找到这里。