Skip to main content
 首页 » 编程设计

Java StringJoiner

2022年07月19日117think

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.


本文参考链接:https://blog.csdn.net/neweastsun/article/details/82913710
阅读延展