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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章