從字串中取得最後 n 個字符
1. 概述
在本教程中,我們將探索幾種從String
取得最後n
字元的不同方法。
假設我們有以下String
,其值代表日期:
String s = "10-03-2024";
我們想要從這個String
中提取年份。換句話說,我們只需要最後四個字符,因此, n
是:
int n = 4;
2.使用substring()
方法
我們可以使用substring()
方法的重載,該方法取得從beginIndex
開始並僅在 endIndex 結束的**endIndex**
:
@Test
void givenString_whenUsingTwoArgSubstringMethod_thenObtainLastNCharacters() {
int beginIndex = s.length() - n;
String result = s.substring(beginIndex, s.length());
assertThat(result).isEqualTo("2024");
}
由於我們需要最後n
字符,因此我們首先透過從String
的長度中減去n
來確定beginIndex
。最後,我們提供endIndex
作為String
的長度。
由於我們只對最後n
個字元感興趣,因此我們可以利用**substring()
方法的更方便的重載,該方法僅將beginIndex
**作為方法參數:
@Test
void givenString_whenUsingOneArgSubstringMethod_thenObtainLastNCharacters() {
int beginIndex = s.length() - n;
assertThat(s.substring(beginIndex)).isEqualTo("2024");
}
此方法傳回從beginIndex
開始到String
末尾的字元。
最後,值得一提的是String
類別的subSequence()
方法的存在,該方法在底層使用了substring()
。儘管它可以用來解決我們的用例,但從可讀性的角度來看,僅使用substring()
方法被認為更合適。
3. 使用 Apache Commons Lang 3 中的StringUtils.right()
方法
要使用Apache Commons Lang 3 ,我們需要將其相依性新增至pom.xml
:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
我們可以使用StringUtils.right()
方法來取得最後n
個字元:
@Test
void givenString_whenUsingStringUtilsRight_thenObtainLastNCharacters() {
assertThat(StringUtils.right(s, n)).isEqualTo("2024");
}
在這裡,我們只需要提供相關的String
以及我們想要從String
末尾傳回的字元數。因此,這將是我們用例的首選解決方案,因為我們無需計算索引,從而產生更易於維護且無錯誤的程式碼。
4. 使用串流API
現在,讓我們探討一下函數式程式設計解決方案是什麼樣子的。
Stream
來源的一種選擇是使用chars()
方法。此方法傳回一個IntStream
,其原始int
元素表示String
中的字元:
@Test
void givenString_whenUsingIntStreamAsStreamSource_thenObtainLastNCharacters() {
String result = s.chars()
.mapToObj(c -> (char) c)
.skip(s.length() - n)
.map(String::valueOf)
.collect(Collectors.joining());
assertThat(result).isEqualTo("2024");
}
這裡,我們使用mapToObj()
中間運算將每個int
元素轉換為Character
物件。現在我們有了一個Character
流,我們可以使用skip()
操作來只保留某個索引之後的元素。
接下來,我們將map()
運算與String::valueOf
方法參考結合使用。我們將每個Character
元素轉換為String
,因為我們希望將終端collect()
操作與Collectors.joining()
靜態方法結合使用。
另一種函數方法最初是使用toCharArray()
方法:
@Test
void givenString_whenUsingStreamOfCharactersAsSource_thenObtainLastNCharacters() {
String result = Arrays.stream(ArrayUtils.toObject(s.toCharArray()))
.skip(s.length() - n)
.map(String::valueOf)
.collect(Collectors.joining());
assertThat(result).isEqualTo("2024");
}
此方法傳回char
基元數組。我們可以使用 Apache Commons Lang 3 中的ArrayUtils.toObject()
將陣列轉換為Character
元素陣列。最後,我們使用靜態方法 Arrays.stream() 來獲得一個Character
流Arrays.stream().
從這裡開始,我們的邏輯保持不變,以獲取最後n
字元。
正如我們在上面所看到的,我們需要做很多工作才能使用函數式程式設計方法來實現我們的目標。這強調了函數式程式設計只有在適當的時候才應該使用。
5. 結論
在本文中,我們探索了從String
中獲取最後n
字元的幾種不同方法。我們強調,命令式方法比函數式方法產生了更簡潔和可讀的解決方案。我們應該注意,本文中探討的從String
中提取年份的範例僅用於演示目的。存在更合適的實現此目的的方法,例如將String
解析為LocalDate
並使用getYear()
方法。
與往常一樣,本文中使用的程式碼範例可在 GitHub 上取得。