不会吧!1202年了,不会还有人不知道StringJoiner是什么吧!

这是个什么东西

简要说明

其实这是一个很简单的拼接字符串的类,能起到的作用其实也很有限。

说到字符串拼接,各位看官瞬间就想到,String家族中的另外两个兄弟,StringBuilder和StirngBuffer,那这个StringJoiner小弟弟,有没有资格进入拼接军团当中,出现三足鼎立的情况呢,且听我细细道来~

大家都知道,是个系统就有登陆,是个登陆就有鉴权的“全套服务”,这个其实没什么,一般系统都会选择OAuth2或者Jwt这些,偏偏我不!我要另辟蹊径,在下初心是好的,无非是Token传到能够解析出来当前用户信息嘛,我想的把用户基本信息和过期时间这些,都变成“_”下划线拼接(例: AccountId_AccountName_ExpireTime),然后AES加密一下,当作token,这样获取当前用户信息,直接解密字符串就好了,减轻redis负担。我以为我可以没问题,结果做完检查的时候,发现了这个代码

account = ....;
// 生成token的过程
StringBuilder sb = new StringBuilder();
sb.append(account.getAccountId());
sb.append("_");
sb.append(account.getAccountName());
sb.append("_")
...
String tokenStr = aes.decode(sb.toString());

其实这么一看,问题倒是没有那么严重,只是每插入一个值,他就要append一个"_"总感觉有点多余和不舒服的感觉。这个是我们本篇文章的主角"StringJoiner"就登场了!

怎么用呢?哪些地方用的到呢

其实通过上方的案例,可以看出来,StringJoiner的应用场景就是多处拼接,并且拼接字符串用的是同一字符的时候,就可以使用了

account = ....;
// 用StringJoiner类替换上方生成token的过程
StringJoiner sj = new StringJoiner("_");
sj.add(account.getAccountId());
sj.add(account.getAccountName());
...
String tokenStr = aes.decode(sj.toString());

他这么神奇,怎么内部如何实现的呢,一步一步的看它的源码,让它“体无完肤”~

构造函数

/**
new StringJoiner("") >> 调用的构造
*/
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;
}

一共两个构造方法,可以看出很简单,就是做了一些属性的赋值,没有什么我们想看的东西,我们接着往下脱

成员变量

private final String prefix;
private final String delimiter;
private final String suffix;

private StringBuilder value;

这里我们重点关注一下value字段,可以看到它是StringBuilder。

接下里我们看StringJoiner的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;
}

这个代码调用就比较简单了,在add方法中使用了value变量,所以由此可以看出来了,其实StringJoiner内部使用了StringBuilder类。

你可能感兴趣的:(不会吧!1202年了,不会还有人不知道StringJoiner是什么吧!)