1. 概述
在这个简短的教程中,我们将探讨在Java中获取字符串前n个字符的不同方法。
首先,我们会学习如何使用核心JDK的方法和类来实现。接着,我们将看到如何借助外部库,如Apache Commons Lang和Guava,达到相同的效果。
2. 使用核心JDK
JDK提供了多种方法,我们可以利用它们来获取给定字符串的前n个字符。让我们深入了解一下每个选项。
2.1. 使用String#substring
方法
substring()
方法属于String
类,它是解答我们核心问题的最简单方案。顾名思义,这个方法返回一个新字符串,它是给定字符串的一部分。
下面演示其用法:
@Test
void givenString_whenUsingSubstringMethod_thenGetFirstChars() {
String givenInput = "Hello Baeldung Readers";
assertEquals("He", givenInput.substring(0, 2));
}
该方法接受两个参数,beginIndex
和endIndex
。beginIndex
表示第一个字符的索引,而endIndex
表示不包含在内的最后一个索引。
因此,返回的子字符串从指定的endIndex
开始,直到endIndex - 1
的字符。
2.2. 使用String#subSequence
方法
另一种解决方案是使用subSequence()
方法。它返回一个CharSequence
对象,该对象包含了指定字符串的一部分。
subSequence(start, end)
的调用与substring(start, end)
的调用行为完全相同。让我们实际操作一下:
@Test
void givenString_whenUsingSubSequenceMethod_thenGetFirstChars() {
String givenInput = "Welcome";
assertEquals("Wel", givenInput.subSequence(0, 3));
}
同样地,该方法返回字符串"Welcome"
的前三个字符"Wel"
。需要注意的是,如果beginIndex
或endIndex
为负数,或者endIndex
大于字符串长度,或者beginIndex
大于endIndex
,此方法会抛出IndexOutOfBoundsException
。
2.3. 使用String#chars
方法
String
类提供了chars()
方法作为另一种获取前n个字符的选择。此新方法是在Java 9中引入的,用于以流的形式处理给定的字符串。
下面通过一个示例展示chars()
方法的用法:
@Test
void givenString_whenUsingStreamApi_thenGetFirstChars() {
String givenInput = "The world is beautiful";
String result = givenInput.chars()
.limit(3)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
assertEquals("The", result);
}
简而言之,chars()
返回一个IntStream
,其中包含了输入字符串的char
值。我们使用limit(3)
方法获取前三个值,然后使用collect()
和StringBuilder
将返回的值组合成一个字符串。
3. 使用Apache Commons Lang
另一种选择是使用Apache Commons Lang库来解决这个问题。它提供了一系列实用类,如StringUtils
,我们可以用来执行字符串操作。
首先,我们需要将其依赖添加到pom.xml
文件中:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
3.1. 使用StringUtils#substring
方法
通常情况下,StringUtils
提供了其版本的substring()
方法。这个方法的特点是相对于String#substring
来说更安全,不会处理空值:
@Test
void givenString_whenUsingStringUtilsSubstringMethod_thenGetFirstChars() {
String givenInput = "Baeldung";
assertEquals("Baeld", StringUtils.substring(givenInput, 0, 5));
}
如上所示,返回的子字符串"Baeld"
从位置0的字符开始,到位置5(不包括)结束。
3.2. 使用StringUtils#left
方法
类似地,我们可以使用left()
方法来达到同样的效果。这个方法返回给定字符串的最左边n个字符。
让我们通过实例说明如何使用StringUtils#left
:
@Test
void givenString_whenUsingStringUtilsLeftMethod_thenGetFirstChars() {
String givenInput = "kindness always wins";
assertEquals("kind", StringUtils.left(givenInput, 4));
}
这个方法的好处是它对指定的字符串输入为null
时返回null
,因此很安全。
4. 使用Guava
另一个解决方案是使用Guava。如往常一样,在开始使用此库之前,我们需要将其依赖项添加到pom.xml
中:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.0.0-jre</version>
</dependency>
Guava提供了Ascii#truncate
方法,我们可以借此方法获取字符串的前n个字符:
@Test
void givenString_whenUsingGuavaTruncateMethod_thenGetFirstChars() {
String givenInput = "Tamassint";
assertEquals("Tama", Ascii.truncate(givenInput, 4, ""));
}
简言之,这个方法会将给定的字符串截断到指定的最大长度,例如在我们的例子中为4个字符。
5. 总结
在这篇短文中,我们探讨了在Java中获取给定字符串前n个字符的不同方法。
我们学习了如何使用JDK的方法和类,然后了解了如何通过Apache Commons Lang和Guava这样的外部库实现相同的目标。
如往常一样,本文中使用的代码可以在GitHub上找到。