java 拆分器结果列表是否会为空?

Will the java Splitter result list ever be empty?

我正在尝试使用 Splitter class 拆分字符串。例如:

List<String> resultList = Splitter.on("|").splitToList(stringToSplit);

我的问题是:resultList 可以为空吗?

我想不出任何情况下它会是空的。但如果我直接使用 resultList.get(0),它似乎有问题。我可以直接打电话给resultList.get(0)不用担心吗?

如何检查字符串 Split 是否包含“|”通话前 Splitter.on.splitToList

无需检查是否为空即可使用

resultList.stream().findFirst().orElseGet(null)

这将 return 列表中的第一个对象,否则它将 return null

基于方法的代码 Splitter#splitToList here, 它将 return 一个空的 ArrayList 以防无法拆分给定的字符串

(在您的情况下,如果字符串不包含“|”)

407  public List<String> splitToList(CharSequence sequence) {
408    checkNotNull(sequence);
409
410    Iterator<String> iterator = splittingIterator(sequence);
411    List<String> result = new ArrayList<String>();
412
413    while (iterator.hasNext()) {
414      result.add(iterator.next());
415    }
416
417    return Collections.unmodifiableList(result);
418  }

因此,您必须确保结果不为空,否则在调用 resultList.get(0)

时会抛出 IndexOutOfBoundsException

好吧,这取决于您如何配置拆分器实例。在这里你必须非常相似的例子,都作为输入采用空字符串。

第一种情况使用“原始”拆分器returns只有一个元素的列表 -- 一个空字符串:

@Test
public void shouldReturnOneEmptyStringForRegularSplitter() {
    //given
    String input = "";
    Splitter splitter = Splitter.on(',');
    //when
    List<String> result = splitter.splitToList(input);
    //then
    assertThat(result).containsOnly("");
}

在第二个示例中,输入相同,但拆分器额外配置为从结果列表中省略空字符串,因此 returns 一个空列表:

@Test
public void shouldReturnOneEmptyStringForCustomized() {
    //given
    String input = "";
    Splitter splitter = Splitter.on(',').omitEmptyStrings();
    //when
    List<String> result = splitter.splitToList(input);
    //then
    assertThat(result).isEmpty();
}

行为是 documented:

For separator-based splitters that do not use omitEmptyStrings, an input string containing n occurrences of the separator naturally yields an iterable of size n + 1. So if the separator does not occur anywhere in the input, a single substring is returned containing the entire input. Consequently, all splitters split the empty string to [""] (note: even fixed-length splitters).

Splitter 有更多选项,您可以根据这些选项配置和更改结果。

在你的情况下,如果你只使用 Splitter.on("|") 而没有任何其他选项,你保证在结果列表中始终至少有一个值。