一、概述
在本教程中,我们将学习多种在Java 中将String截断为所需字符数的方法。
我们将从探索使用JDK 本身执行此操作的方法开始。然后我们将看看如何使用一些流行的第三方库来做到这一点。
2.使用JDK 截断String
Java 提供了许多方便的方法来截断String。让我们来看看。
2.1。使用**String'的substring()** 方法
String类带有一个方便的方法,称为substring.顾名思义, substring()返回给定String在指定索引之间的部分。
让我们看看它的实际效果:
static String usingSubstringMethod(String text, int length) {
 if (text.length() <= length) {
 return text;
 } else {
 return text.substring(0, length);
 }
 }在上面的例子中,如果指定的length大于text的长度,我们返回text本身。这是因为传递给substring()的length大于String中的字符数会导致IndexOutOfBoundsException。
否则,我们返回从索引0 开始并扩展到(但不包括)索引length.
让我们使用一个测试用例来确认这一点:
static final String TEXT = "Welcome to baeldung.com";
 @Test
 public void givenStringAndLength_whenUsingSubstringMethod_thenTrim() {
 assertEquals(TrimStringOnLength.usingSubstringMethod(TEXT, 10), "Welcome to");
 }正如我们所看到的,开始索引是包含的,结束索引是排除的。因此,索引length处的字符将不会包含在返回的子字符串中。
2.2.使用String'的split() 方法
另一种截断String的方法是使用split()方法,该方法使用正则表达式将String拆分为多个片段。
在这里,我们将使用一个名为positive lookbehind 的正则表达式功能来匹配从String开头开始的指定数量的字符:
static String usingSplitMethod(String text, int length) {
 String[] results = text.split("(?<=\\G.{" + length + "})");
 return results[0];
 }results的第一个元素将是我们截断的String,或者如果length大于text,则为原始String。
让我们测试一下我们的方法:
@Test
 public void givenStringAndLength_whenUsingSplitMethod_thenTrim() {
 assertEquals(TrimStringOnLength.usingSplitMethod(TEXT, 13), "Welcome to ba");
 }2.3.使用Pattern类
类似地,我们可以使用Pattern类来编译一个正则表达式,它匹配String的开头直到指定数量的字符。
例如,让我们使用{1,” + length + “}.此正则表达式匹配至少一个且最多length字符:
static String usingPattern(String text, int length) {
 Optional<String> result = Pattern.compile(".{1," + length + "}")
 .matcher(text)
 .results()
 .map(MatchResult::group)
 .findFirst();
 return result.isPresent() ? result.get() : EMPTY;
 }正如我们在上面看到的,在将我们的正则表达式编译成Pattern之后,我们可以使用Pattern's matcher()方法根据该正则表达式来解释我们的String。然后我们可以对结果进行分组并返回第一个,也就是我们截断的String。
现在让我们添加一个测试用例来验证我们的代码是否按预期工作:
@Test
 public void givenStringAndLength_whenUsingPattern_thenTrim() {
 assertEquals(TrimStringOnLength.usingPattern(TEXT, 19), "Welcome to baeldung");
 }2.4.使用CharSequence'scodePoints()方法
Java 9 提供了一个codePoints()方法来将String转换为代码点值流。
让我们看看如何使用此方法与流API 相结合来截断字符串:
static String usingCodePointsMethod(String text, int length) {
 return text.codePoints()
 .limit(length)
 .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
 .toString();
 }在这里,我们使用limit()方法将Stream限制为给定的length。然后我们使用StringBuilder来构建我们的截断字符串。
接下来,让我们验证我们的方法是否有效:
@Test
 public void givenStringAndLength_whenUsingCodePointsMethod_thenTrim() {
 assertEquals(TrimStringOnLength.usingCodePointsMethod(TEXT, 6), "Welcom");
 }3. Apache Commons 库
Apache Commons Lang 库包含一个用于操作String的StringUtils类。
首先,让我们将Apache Commons依赖项添加到我们的pom.xml中:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency>
3.1。使用StringUtils's left()方法
StringUtils有一个有用的static方法,称为left()。StringUtils.left()以null 安全的方式返回String最左边的指定数量的字符:
static String usingLeftMethod(String text, int length) {
 return StringUtils.left(text, length);
 }3.2.使用StringUtils'的truncate()方法
或者,我们可以使用StringUtils.truncate()来实现相同的目标:
public static String usingTruncateMethod(String text, int length) {
 return StringUtils.truncate(text, length);
 }4. 番石榴图书馆
除了使用核心Java 方法和Apache Commons 库来截断String之外,我们还可以使用Guava。让我们首先将Guava依赖项添加到我们的pom.xml文件中:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency>
现在我们可以使用Guava 的Splitter类来截断我们的String:
static String usingSplitter(String text, int length) {
 Iterable<String> parts = Splitter.fixedLength(length)
 .split(text);
 return parts.iterator()
 .next();
 }我们使用Splitter.fixedLength()将我们的String拆分为给定length的多个部分。然后,我们返回结果的第一个元素。
5. 结论
在本文中,我们学习了多种在Java 中将String截断为特定数量字符的方法。
我们研究了一些使用JDK 执行此操作的方法。然后我们使用几个第三方库截断了String。

 
							 
										
										 
										
										 
										
										
										 
										
										 
										
										 
										
										
0 评论