Java 8新特性(10) StringJoiner

  1. String 的新方法
  2. Collector.joining
  3. 其他方法
  4. 参考

原有的 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 是前缀加后缀, 用户可自定义 emptyValue
  • merge(StringJoiner other):合并另外一个 joiner
  • length:当前长度,为空看 emptyValue 的长度

参考

https://www.jianshu.com/p/469fe8fdd3be


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 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" 转载请保留原文链接及作者。

目录