Java 8 StringJoiner
简介
java.util包中StringJoiner类是java8新增功能。主要实现字符串连接,使用间隔符、前缀和后缀。
增加元素
可以直接调用add()方法增加元素:
@Test
public void whenAddingElements_thenJoinedElements() {
StringJoiner joiner = new StringJoiner(",", PREFIX, SUFFIX);
joiner.add("Red")
.add("Green")
.add("Blue");
assertEquals(joiner.toString(), "[Red,Green,Blue]");
}
如果需要增加list中所有元素,可以使用遍历list实现,使用StringJoiner暂时没有更好的办法。
@Test
public void whenAddingListElements_thenJoinedListElements() {
List<String> rgbList = new ArrayList<>();
rgbList.add("Red");
rgbList.add("Green");
rgbList.add("Blue");
StringJoiner rgbJoiner = new StringJoiner(
",", PREFIX, SUFFIX);
for (String color : rgbList) {
rgbJoiner.add(color);
}
assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]");
}
StringJoiner构造函数
构造StringJoiner类实例,需要提供分隔符,另外,也可以提供前缀或后缀用于结果值:
private String PREFIX = "[";
private String SUFFIX = "]";
@Test
public void whenEmptyJoinerWithoutPrefixSuffix_thenEmptyString() {
StringJoiner joiner = new StringJoiner(",");
assertEquals(0, joiner.toString().length());
}
@Test
public void whenEmptyJoinerJoinerWithPrefixSuffix_thenPrefixSuffix() {
StringJoiner joiner = new StringJoiner(
",", PREFIX, SUFFIX);
assertEquals(joiner.toString(), PREFIX + SUFFIX);
}
使用toString()方法可以获取当前值。
需要提醒的是StringJoiner对象默认返回值。StringJoiner对象没有前缀和后缀返回空,带前缀和后缀返回字符串值包含前缀和后缀。我们可以调用setEmptyValue()设置缺省值:
@Test
public void whenEmptyJoinerWithEmptyValue_thenDefaultValue() {
StringJoiner joiner = new StringJoiner(",");
joiner.setEmptyValue("default");
assertEquals(joiner.toString(), "default");
}
@Test
public void whenEmptyJoinerWithPrefixSuffixAndEmptyValue_thenDefaultValue() {
StringJoiner joiner = new StringJoiner(",", PREFIX, SUFFIX);
joiner.setEmptyValue("default");
assertEquals(joiner.toString(), "default");
}
这里两个测试方法都返回EMPTY_JOINER常量。仅当StringJoiner是空才返回缺省值。
合并连接
我们使用merge()方法能合并两个连接器,其连接两者内容,但并不使用前缀和后缀作为后者的内容。
@Test
public void whenMergingJoiners_thenReturnMerged() {
StringJoiner rgbJoiner = new StringJoiner(
",", PREFIX, SUFFIX);
StringJoiner cmybJoiner = new StringJoiner(
"-", PREFIX, SUFFIX);
rgbJoiner.add("Red")
.add("Green")
.add("Blue");
cmybJoiner.add("Cyan")
.add("Magenta")
.add("Yellow")
.add("Black");
rgbJoiner.merge(cmybJoiner);
assertEquals(
rgbJoiner.toString(),
"[Red,Green,Blue,Cyan-Magenta-Yellow-Black]");
}
“-”用于cmybJoiner,rgbJoiner仍使用",".
Stream API
除了上述功能,Stream Api还有一种间接用法:
@Test
public void whenUsedWithinCollectors_thenJoined() {
List<String> rgbList = Arrays.asList("Red", "Green", "Blue");
String commaSeparatedRGB = rgbList.stream()
.map(color -> color.toString())
.collect(Collectors.joining(","));
assertEquals(commaSeparatedRGB, "Red,Green,Blue");
}
Collectors.joining() 内部使用StringJoiner 执行连接操作。
总结
本文介绍了如何使用StringJoiner类。总的来说,StringJoiner看起来非常原始,并且没有处理一些基本的集合元素情况,比如加入列表的元素。它似乎主要是为Collectors设计。如果StringJoiner不满足我们的需求,还有其他流行的和强大的库,比如Guava.