Java 8新特性(10) StringJoiner
原有的 StringBuilder 太死板,不支持分割,如果想让最终的字符串以逗号隔开,需要这样写
StringBuilder sb = new StringBuilder();
IntStream.range(1,10).forEach(i->{
sb.append(i+"");
if( i < 10){
sb.append(",")
}
});
是不是太死板了,不好用,StringJoiner 怎样写呢?
StringJoiner sj = new StringJoiner(",");
IntStream.range(1,10).forEach(i->sj.add(i+"")); // 1,2,3,4,5,6,7,8,9
// 还可以加前缀后缀
StringJoiner sj = new StringJoiner(",", "[", "]");
IntStream.range(1,10).forEach(i->sj.add(i+"")); // [1,2,3,4,5,6,7,8,9]
String 的新方法
String.join(":", "foobar", "foo", "bar");
// foobar:foo:bar
// 源码也是使用了 StringJoiner
public static String join(CharSequence delimiter, CharSequence... elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
// Number of elements not likely worth Arrays.stream overhead.
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements) {
joiner.add(cs);
}
return joiner.toString();
}
Collector.joining
String [] strArray = new String[] {"a", "b", "c"};
String s = Stream.of(strArray).collect(Collectors.joining(","));
// 实现原理也是借助了 StringJoiner
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
return new CollectorImpl<>(
() -> new StringJoiner(delimiter, prefix, suffix),
StringJoiner::add, StringJoiner::merge,
StringJoiner::toString, CH_NOID);
}
其他方法
setEmptyValue
:默认情况下的 emptyValue 是前缀加后缀, 用户可自定义 emptyValuemerge(StringJoiner other)
:合并另外一个 joinerlength
:当前长度,为空看 emptyValue 的长度
参考
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:Java 8新特性(10) StringJoiner
文章字数:325
本文作者:Bin
发布时间:2019-03-13, 21:29:22
最后更新:2019-08-06, 00:07:35
原始链接:http://coolview.github.io/2019/03/13/Java8/Java%208%E6%96%B0%E7%89%B9%E6%80%A7(10)%20StringJoiner/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。