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("|")
而没有任何其他选项,你保证在结果列表中始终至少有一个值。
我正在尝试使用 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)
好吧,这取决于您如何配置拆分器实例。在这里你必须非常相似的例子,都作为输入采用空字符串。
第一种情况使用“原始”拆分器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("|")
而没有任何其他选项,你保证在结果列表中始终至少有一个值。