1. 概述

在这个简短的教程中,我们将探讨在Java中获取字符串前n个字符的不同方法。

首先,我们会学习如何使用核心JDK的方法和类来实现。接着,我们将看到如何借助外部库,如Apache Commons LangGuava,达到相同的效果。

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));
}

该方法接受两个参数,beginIndexendIndexbeginIndex表示第一个字符的索引,而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"。需要注意的是,如果beginIndexendIndex为负数,或者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上找到。