Java中字符串的首字母大寫
一、概述
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()
方法
解決問題的另一個思路是使用正則表達式(“ ^.
”)匹配第一個字符,並將匹配的組轉換為大寫。
在 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 上獲得。