Guava Joiner

Joiner

Joiner可以将一系列的字符串用指定的分隔符进行拼接。

使用

  • 构造方法

Joiner的构造方法都是私有的,需要使用其提供的静态方法获取对象。

// 私有构造方法
private Joiner(String separator) {
    this.separator = checkNotNull(separator);
  }
private Joiner(Joiner prototype) {
  this.separator = prototype.separator;
}

// 静态方法
public static Joiner on(String separator) {
    return new Joiner(separator);
}
public static Joiner on(char separator) {
  return new Joiner(String.valueOf(separator));
}
  • 拼接方法

appendTo()方法是Joiner最基础的方法,所有的拼接都会用到这个方法,例如join()方法。

/**
 * A appendable 装拼接结果的容器
 * Iterator<?> parts 要拼接的对象,需要实现Iterator接口
 * 返回值 <A extends Appendable> A 返回装拼接结果的容器,其实这里就是传入的appendable
 */
public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException {
	// 检查对象是否为空
    checkNotNull(appendable);

    if (parts.hasNext()) {
      // 使用本地的Joiner提供的toString()方法,防止NullPointerException
      appendable.append(toString(parts.next()));
      // if-while结构保证最后一个字符串之后没有分隔符
      while (parts.hasNext()) {
        appendable.append(separator);
        appendable.append(toString(parts.next()));
      }
    }
    return appendable;
  }

join()方法,底层调用了appendTo()方法。

public final String join(Iterable<?> parts) {
  return join(parts.iterator());
}

public final String join(Iterator<?> parts) {
  return appendTo(new StringBuilder(), parts).toString();
}

public final String join(Object[] parts) {
  return join(Arrays.asList(parts));
}

public final String join(@Nullable Object first, @Nullable Object second, 				Object... rest) {
  return join(iterable(first, second, rest));
}
  • 其他方法

useForNull方法,将传入的字符串作为集合中null值的替换值。

public Joiner useForNull(final String nullText) {
  
  checkNotNull(nullText);
  // 因为得到Joiner对象之后就不能再改变,所以在方法内返回了一个匿名Joiner类对象,覆写方法
  return new Joiner(this) {
    @Override
    CharSequence toString(@Nullable Object part) {
      // 如果有null,就用nullText替换
      return (part == null) ? nullText : Joiner.this.toString(part);
    }

	// 禁止重复调用
    @Override
    public Joiner useForNull(String nullText) {
      throw new UnsupportedOperationException("already specified useForNull");
    }
	
	// 禁止重复调用
    @Override
    public Joiner skipNulls() {
      throw new UnsupportedOperationException("already specified useForNull");
    }
  };
}

skipNulls方法,跳过null值。

public Joiner skipNulls() {
  // 匿名类,作用同useForNull
  return new Joiner(this) {
    @Override
    public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException {
      checkNotNull(appendable, "appendable");
      checkNotNull(parts, "parts");
      
      // 拼接第一个非null元素,这样的目的有两个,1是防止最后一个元素加上了分隔符,2是防止只有一个非null元素还要单独进行分隔符的处理
      while (parts.hasNext()) {
        Object part = parts.next();
        if (part != null) {
          appendable.append(Joiner.this.toString(part));
          break;
        }
      }
      
      while (parts.hasNext()) {
        Object part = parts.next();
        // 非null元素以及分隔符进行拼接
        if (part != null) {
          appendable.append(separator);
          appendable.append(Joiner.this.toString(part));
        }
      }
      return appendable;
    }

	// 禁止重复调用
    @Override
    public Joiner useForNull(String nullText) {
      throw new UnsupportedOperationException("already specified skipNulls");
    }

	// 禁止重复调用
    @Override
    public MapJoiner withKeyValueSeparator(String kvs) {
      throw new UnsupportedOperationException("can't use .skipNulls() with maps");
    }
  };
}

withKeyValueSeparator方法,将键值对用指定分隔符进行拼接。

public MapJoiner withKeyValueSeparator(char keyValueSeparator) {
  return withKeyValueSeparator(String.valueOf(keyValueSeparator));
}

public MapJoiner withKeyValueSeparator(String keyValueSeparator) {
  return new MapJoiner(this, keyValueSeparator);
}

toString方法

CharSequence toString(Object part) {
  checkNotNull(part); // checkNotNull for GWT (do not optimize).
  return (part instanceof CharSequence) ? (CharSequence) part : part.toString();
}

猜你喜欢

转载自blog.csdn.net/weixin_40739833/article/details/92977413