將字串中每個單字的第一個字母大寫
1. 概述
在這個簡短的教程中,我們將闡明如何在 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.13.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));
}
七、結論
在這篇短文中,我們探索了在 Java 中將給定字串的每個單字的第一個字母大寫的不同方法。
首先,我們解釋瞭如何使用 JDK 來實現這一點。然後,我們說明如何使用第三方函式庫來回答我們的核心問題。
與往常一樣,本文中使用的程式碼可以在 GitHub 上找到。