joiner可以用于字符串拼接,代码示例如下:
package org.example.model;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;
public class JoinerTest {
@Test
public void testJoinOnJoin () {
List<String> stringList = Arrays.asList("Google", "Guava", "Java");
List<String> stringListContainsNull = Arrays.asList("Google", null, "Guava", "Java");
// 1. 使用#连接
String result = Joiner.on("#").join(stringList);
assertThat(result).isEqualTo("Google#Guava#Java");
// 2. 拼接的list中有null,会抛出空指针异常
Assertions.assertThatNullPointerException().isThrownBy(() -> Joiner.on("#").join(stringListContainsNull));
// 3. 有空指针时,可以选择跳过空指针
result = Joiner.on("#").skipNulls().join(stringListContainsNull);
assertThat(result).isEqualTo("Google#Guava#Java");
// 3. 有空指针时,可以使用默认值代替
result = Joiner.on("#").useForNull("NULL").join(stringListContainsNull);
assertThat(result).isEqualTo("Google#NULL#Guava#Java");
// 4. appendTo, joiner返回的builder和如此的builder是同一个对象, 除了StringBuilder,也可以使用使用实现了
// Appendable接口的类,比如使用FileWrite直接将拼装的字符串写入文件。
StringBuilder stringBuilder = new StringBuilder();
StringBuilder joinedStringBuilder = Joiner.on("#").useForNull("NULL").appendTo(stringBuilder, stringListContainsNull);
assertThat(joinedStringBuilder).isSameAs(stringBuilder).asString().isEqualTo("Google#NULL#Guava#Java");
// 5,不用guava,也可以使用java 8 stream拼接
result = stringListContainsNull.stream().filter(Objects::nonNull).collect(Collectors.joining("#"));
assertThat(result).isEqualTo("Google#Guava#Java");
result = stringListContainsNull.stream().map(item -> (item != null ? item : "NULL")).collect(Collectors.joining("#"));
assertThat(result).isEqualTo("Google#NULL#Guava#Java");
// 6. map也可以按照{key{keyValue分隔符}value}{mapEntry分隔符}{key{keyValue分隔符}value}拼接
ImmutableMap<Object, Object> map = ImmutableMap.builder().put("王", "小文").put("李", "元霸").build();
result = Joiner.on("##").withKeyValueSeparator("(姓)").join(map);
assertThat(result).isEqualTo("王(姓)小文##李(姓)元霸");
}
}