欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

StringBuilder?试试StringJoiner使用

程序员文章站 2022-03-05 15:01:30
难道拼接字符串还在用StringBuilder/StringBuffer嘛?如果需要拼接分隔符的字符串,我使用Java8->StringJoiner。StringJoiner的基本使用字面上理解就是用来拼接字符串的,一般需要分隔符进行拼接,如:hello,你根本不知道我有多害怕,耶这种三段式由","分割的字符串,在Java8之前都会去使用StringBuilder/StringBuffer进行拼接,如:StringBuilder sb = new StringBuilder(...

难道拼接字符串还在用StringBuilder/StringBuffer嘛?

如果需要拼接分隔符的字符串,我使用Java8->StringJoiner。

StringJoiner的基本使用

字面上理解就是用来拼接字符串的,一般需要分隔符进行拼接,如:

hello,你根本不知道我有多害怕,耶

这种三段式由","分割的字符串,在Java8之前都会去使用StringBuilder/StringBuffer进行拼接,如:

StringBuilder sb = new StringBuilder();
sb.append("hello");
sb.append(",");
sb.append("你根本不知道我有多害怕");
sb.append(",");
sb.append("耶");
String str = sb.toString();

都是相同的分割符逗号,如果要拼接的字符串过多,代码会十分不整洁;

Java8之后有StringJoiner,这件事情变得简单,分割符这种全部一次性交给StringJoiner即可。

StringJoiner基本使用示例:

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",");
 stringJoiner.add("hello");
 stringJoiner.add("你根本不知道我有多害怕");
 stringJoiner.add("耶");
 System.out.println(stringJoiner.toString());
}

可以看到这样写省去了许多没有必要的分隔符拼接操作,代码更优雅,只是可读性没SB直接拼接那么直观了

StringJoiner详细介绍

StringBuilder?试试StringJoiner使用

它的父类就是Object,这些成员变量和方法都有什么用呢?

成员变量:

  • prefix:拼接后的字符串前缀
  • delimiter:拼接时的字符串分隔符
  • suffix:拼接后的字符串后缀
  • value:拼接后的值
  • emptyValue:空值的情况,value为null时返回

够造方法:

public StringJoiner(CharSequence delimiter) {
        this(delimiter, "", "");
    }
public StringJoiner(CharSequence delimiter,
                        CharSequence prefix,
                        CharSequence suffix) {
        Objects.requireNonNull(prefix, "The prefix must not be null");
        Objects.requireNonNull(delimiter, "The delimiter must not be null");
        Objects.requireNonNull(suffix, "The suffix must not be null");
        // make defensive copies of arguments
        this.prefix = prefix.toString();
        this.delimiter = delimiter.toString();
        this.suffix = suffix.toString();
        this.emptyValue = this.prefix + this.suffix;
    }

提供了两个够造方法,一个必须带分隔符,另一个必须带分隔符,前缀,后缀,可以看了emptyValue默认为前缀和后缀组成!

公开方法:

  • setEmptyValue:设置空值
  • toString:转化成String
  • add:添加字符串
  • merge:从另一个StringJoiner合并
  • length:长度(包括前缀后缀)

流式API

add方法源码:

public StringJoiner add(CharSequence newElement) {
        prepareBuilder().append(newElement);
        return this;
    }
private StringBuilder prepareBuilder() {
        if (value != null) {
            value.append(delimiter);
        } else {
            value = new StringBuilder().append(prefix);
        }
        return value;
    }

可以看到内部其实就是用的StringBuilder进行封装的,首次创建会先拼接前缀,后续先添加分隔符,在添加字符串;

如上面的示例一行代码解决:


public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",").add("hello").add("你跟本不知道我有多害怕").add("耶");
 System.out.println(stringJoiner.toString());
}

前后缀拼接:

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
 stringJoiner.add("hello");
 stringJoiner.add("你根本不知道我有多害怕");
 stringJoiner.add("耶");
 System.out.println(stringJoiner.toString());
//[hello,你根本不知道我有多害怕,耶]
}

前后都带中括号进行了包装。

空值处理:

没有拼接任何字符串的几个控制场景处理

输出空白字符串

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",");
 System.out.println(stringJoiner.toString());
}

输出前后缀:

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
}

输出指定字符串:

通过setEmptyValue进行设置

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
 stringJoiner.setEmptyValue("void");
 System.out.println(stringJoiner.toString());
}

String.Join();

String.Join()是针对StringJoiner又封装了一层的API,可以传入动态参数或者迭代器。

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();
    }
public static String join(CharSequence delimiter,
            Iterable<? extends CharSequence> elements) {
        Objects.requireNonNull(delimiter);
        Objects.requireNonNull(elements);
        StringJoiner joiner = new StringJoiner(delimiter);
        for (CharSequence cs: elements) {
            joiner.add(cs);
        }
        return joiner.toString();
    }

这两个方法只能进行简单的拼接操作,不能添加前缀和后缀,控制设置处理等;

public static void main(String[] args) {
 String str = String.join(",", "hello", "你根本不知道我有多害怕", "耶");
 System.out.println(str);
}

总结:

了解StringJoiner,StringBuilder,String.Join()之间的关系及使用,在使用拼接多个相同的分隔符,使用StringJoiner,简单处理使用String.Join();

不同场景使用不同API;

我的博客网站也可以看往期发布博文:https://wzdhhp.blog.csdn.net/

本文地址:https://blog.csdn.net/qq_42464423/article/details/109896936