如何使条件 StringUtils 小于 Java 中的特定字符

How to make conditions StringUtils less than specific character in Java

我写了一个字符串 class 来屏蔽用户名,例如;

输入 --> Johny Holloway 期待输出 ---> J***y H***y

及其工作原理。

但是如果用户输入的名字和姓氏少于 3 个字符,我想更改我的代码

例子;名称 BR ---> B***R ;姓氏 --> KL ---> K***L

如何根据上面的例子修改我的代码

我的代码如下;

public class MaskWords {

  public String mask(String str) {

    if (StringUtils.isBlank(str)) {
      return str;
    }

    String out = "";
    for (String d : str.split("\s+")) {
      String startChar = d.substring(0, 1);
      String endChar = d.substring(d.length() - 1, d.length());
      out = out + startChar + "***" + endChar + " ";
    }
    return out.trim();
  }

  public List<String> mask(List<String> str) {
    List<String> maskedStringList = new ArrayList<>();
    for (String stringToMask : str) {
      maskedStringList.add(mask(stringToMask));
    }
    return maskedStringList;
  }  

以不同的方式处理大小写,对于 2 个字符,它可以相同。

为了使代码更好,不要使用char (UTF-16) 而是Unicode 代码点。 有时 Unicode 代码点、符号使用 2 个字符:中文、表情符号。所以更一般 将是:

StringBuilder out = new StringBuilder(str.length + 10);
for (String d : str.split("\s+")) {
    int codePoints = d.codePointCount(0, d.length());
    if (codePoints >= 2) {
        int startChar = d.codePointAt(0);
        int endChar = d.codePointBefore(d.length());
        out.appendCodePoint(startChar).append("***").appendCodePoint(endChar).append(' ');
    } else if (codePoints == 1) {
        out.append(d).append("***").append(' ');
        // Or: out.append("* ");
    }
}
return out.toString().trim();

使用 1 个代码点,我制作了 X***(更好的 *)但如果需要,X***X 将被第一个 if 覆盖,因为 > 0.

StringBuilder 更快,它的 appendCodePoint 在这里很有用。