Java 8 StringJoiner

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/neweastsun/article/details/82913710

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.

猜你喜欢

转载自blog.csdn.net/neweastsun/article/details/82913710
今日推荐