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();
}