大家好,我是北君。在本文中,我们将学习在Java中将String截断为所需字符数的集中方法。首先,我们将探索使用JDK本身实现这一目标的方法。然后,我们将看看如何使用一些流行的第三方库来实现这一点。使用JDK截断字符串Java提供了许多方便的方法来截断字符串。让我们来看看。使用String的substring()方法String类有一个方便的方法,称为substring,顾名思义,substring()返回指定索引之间的String部分。让我们看看它的实际效果。staticStringusingSubstringMethod(Stringtext,intlength){if(text.length()<=length){返回文本;}else{returntext.substring(0,length);}}在上面的例子中,如果指定的长度大于文本的长度,我们返回文本本身。这是因为传递给substring()的长度大于String中的字符数将导致IndexOutOfBoundsException。否则,我们返回从索引0开始并延伸到——但不包括——索引长度的字符子串。让我们用一个测试用例来证实这一点。staticfinalStringTEXT="Welcometojavanorth.cn";@TestpublicvoidgivenStringAndLength_whenUsingSubstringMethod_thenTrim(){assertEquals(TrimStringOnLength.usingSubstringMethod(TEXT,10),"Welcometo");}可以看到,的起始索引是Inclusive,结束索引是排他的。因此,索引长度处的字符不会包含在返回的子字符串中。使用字符串的split()方法另一种截断字符串的方法是使用split()方法,它使用正则表达式将字符串拆分为多个部分。这里我们将使用一个正则表达式特性,称为正向后向匹配,以匹配从String开始的指定数量的字符。staticStringusingSplitMethod(Stringtext,intlength){String[]结果=text.split("(?<=\\G.{"+length+"})");returnresults[0];}results一个元素将是我们截断的字符串,如果长度比文本长,则为原始字符串。让我们测试一下我们的方法。@TestpublicvoidgivenStringAndLength_whenUsingSplitMethod_thenTrim(){assertEquals(TrimStringOnLength.usingSplitMethod(TEXT,13),"Welcometoba");}使用Pattern类类似的,我们可以使用Pattern类编译一个可以匹配String开头的正则表达式,最多指定的字符数。例如,让我们使用{1,"+length+"}。此正则表达式匹配至少一个且最多length个字符。staticStringusingPattern(Stringtext,intlength){Optionalresult=Pattern.compile(".{1,"+length+"}").matcher(text).results().map(MatchResult::group).findFirst();返回result.isPresent()?result.get():EMPTY;}正如我们在上面看到的,在将我们的正则表达式编译成Pattern之后,我们可以使用Pattern的matcher()方法根据这个正则表达式来解释我们的String。然后我们可以对结果进行分组并返回第一个结果,这是我们截断的String。现在让我们添加一个测试用例来验证我们的代码是否按预期工作。@TestpublicvoidgivenStringAndLength_whenUsingPattern_thenTrim(){assertEquals(TrimStringOnLength.usingPattern(TEXT,19),"Welcometojavanorth");}使用CharSequence的codePoints()方法Java9提供了codePoints()方法将String转换为码位价值流。让我们看看如何结合使用此方法和StreamAPI来截断字符串。staticStringusingCodePointsMethod(Stringtext,intlength){returntext.codePoints().limit(length).collect(StringBuilder::new,StringBuilder::appendCodePoint,StringBuilder::append).toString();}这里我们使用limit()方法来限制Stream的长度。然后我们使用StringBuilder构建截断的字符串。接下来,让我们验证我们的方法是否有效。@TestpublicvoidgivenStringAndLength_whenUsingCodePointsMethod_thenTrim(){assertEquals(TrimStringOnLength.usingCodePointsMethod(TEXT,6),"Welcom");}ApacheCommons库ApacheCommonsLang库包括一个用于操作字符串的StringUtils类。首先,让我们将ApacheCommons依赖项添加到我们的pom.xml中。org.apache.commonscommons-lang33.12.0使用StringUtils的left()方法StringUtils有一个有用的静态方法叫做left()。StringUtils.left()以安全的方式返回String最左边指定数量的字符:.staticStringusingLeftMethod(Stringtext,intlength){returnStringUtils.left(text,length);}使用StringUtils的truncate()方法另外,我们可以使用StringUtils.truncate()来达到同样的目的。publicstaticStringusingTruncateMethod(Stringtext,intlength){returnStringUtils.truncate(text,length);}Guavalibrary除了使用核心Java方法和ApacheCommons库截断String,我们还可以使用Guava。让我们首先将Guava依赖项添加到我们的pom.xml文件中。com.google.guavaguava31.0.1-jre现在我们可以使用Guava的Splitter类来截断我们的字符串.staticStringusingSplitter(Stringtext,intlength){Iterableparts=Splitter.fixedLength(length).split(text);returnparts.iterator().next();}我们使用Splitter.fixedLength()将我们的Splits字符串拆分为给定长度的多个片段。然后,我们返回结果中的第一个元素。总结在本文中,我们学习了在Java中将String截断为特定字符数的各种方法。我们研究了使用JDK执行此操作的一些方法。然后,我们使用一些第三方库来截断String。