继续创造,加速生长!这是我参与「日新方案 6 月更文应战」的第13天,点击检查活动概况
姊妹篇:
/post/711246…
在初始化磁盘咱们的开发中常常会用到Guava中的一些功用。可是咱们所运用到的只是G指针数组和数组指针的区别uava API中的字符型变量小的不幸的一个子集。咱们指针数组大家一起来发掘一下Guava中更多的一些功用。
Joiner
这是在咱们代码中出现频率比较高的一个功用。常常需求将几个字符串,或许字符串数组、列表之类的东西,拼接成一个以指源码1688定符号分指针式万用表使用方法隔各个元素的字符串指针万用表读数图解,比如要将一个用List保函数调用的方法存的字符调集拼起来作为SQL语句的条件,在知道Joi函数调用的三种方式ner之前咱们会这样做。
ArrayList<String> conditions = new ArrayList<String>();
conditions.add("condition1");
conditions.add("condition2");
conditions.add("condition3");
private String buildCondition(ArrayList<String> conditions) {
StringBuilder sb = new StringBuilder();
for (String condition : conditions) {
sb.append(condition);
sb.append(" or ");
}
int index = sb.lastIndexOf(" or ");
return index > 0 ? sb.substring(0, index) : sb.toString();
} // condition1 or condition2 or condition3
基本上会手写循环去完成,代码瞬间变得丑陋起来。而且循环完了还得删去字符串是什么意思最终一个剩余的or。
运用Guava字符间距加宽2磅怎么设置东西,咱们能够轻而易举的完成字符串拼接这一简单使命。凭借 Joiner 类,代码瞬间变得高雅起来。
Joiner.on(" or ").join(conditions);
被拼接的目标集,可所以硬编码的少数几个目标,可所以完成了 Iterable 接口的调集,也可所以迭代器目标。
除了回来一个拼接过的字符串,J字符间距oine函数调用的三种方式r 还能够在完成了 Appendable 接口的目标所维护的内容的结尾,追初始化电脑的后果加字符串拼接的成果。
StringBuilder sb = new StringBuilder("result:");
Joiner.on("#").appendTo(sb, 1, 2, 3);
System.out.println(sb); //result:1#2#3
咱们看下面这个例子:
Joiner.on("#").join(1, null, 3)
假如传入的目标中包括空指针,会直接抛出空指针反常。Joiner 提供了两个指针数学办法,让咱们能够高雅的处理待拼接调集中的空指针。
假如咱们希望忽略空指针,那么能够调用 skipNulls办法,得到一个会越过空指针的 Joiner 实例。假如希望将空指针变为某个指定的值,那么能够调用 useForNull 办法,指定用来替换空指针的字符串。
Joiner.on("#").skipNulls().join(1, null, 3); //1#3
Joiner.on("#").useForNull("").join(1, null, 3); //1##3
Joiner.MapJoiner字符串是什么意思
MapJoiner 是 Joiner 的内部静态类,用于协助将 Map 目标拼初始化电脑接成字符串。
Map<Integer, Integer> test = new HashMap<Integer, Integer>();
test.put(1, 2);
test.put(3, 4);
Joiner.on("#").withKeyValueSeparator("=").join(test); //1=2#3=4
withKeyValueSeparator 办法指定了键与值的分隔符,一起回来一个 MapJoiner 实例。
Joiner.on("#").withKeyValueSeparator("=").join(ImmutableMap.of(1, 2, 3, 4)); //1=2#3=4
源代码剖析
源码来自Guava 18.0。Joiner类的源码一共458行。字符是什么大部分都是注释。
Joiner 只指针万用表怎么读数能经过源码之家 Joiner.on 函数来初始化,它的构造办法是私有的。
/**
* Returns a joiner which automatically places {@code separator} between consecutive elements.
*/
public static Joiner on(String separator) {
return new Joiner(separator);
}
/**
* Returns a joiner which automatically places {@code separator} between consecutive elements.
*/
public static Joiner on(char separator) {
return new Joiner(String.valueOf(separator));
}
整个 Joiner 类最中心的函数莫过于 <A extends Appendable> appendT初始化磁盘o(A, Iter指针数组和数组指针的区别ator<?>)
,全部字符间距加宽2磅怎么设置的字符串拼接操作,最终都会调用到这个函数。这就是所指针数学谓的全功用函数,其他的全部 appendTo 只不过是它的重载,全部的join不过是它和它的重载的封装。
/**
* Appends the string representation of each of {@code parts}, using the previously configured
* separator between each, to {@code appendable}.
*
* @since 11.0
*/
public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException {
checkNotNull(appendable);
if (parts.hasNext()) {
appendable.append(toString(parts.next()));
while (parts.hasNext()) {
appendable.append(separator);
appendable.append(toString(parts.next()));
}
}
return appendable;
}
这函数调用是什么意思段代码的第一个技巧是运用 if 和 while 来完成了比较高雅的分隔符拼接,避免了在结尾插入分隔符的尴尬;第二个技巧是运用了自字符间距加宽2磅怎么设置定义的 toString 办法而不是 Object#toString 来将目标序列化成字符串,为后续的各种空指针维护开了方便之门。
来看一个比较有意思的 appendTo 重载。
public final StringBuilder appendTo(StringBuilder builder, Iterator<?> parts) {
try {
this.appendTo((Appendable)builder, (Iterator)parts);
return builder;
} catch (IOException var4) {
throw new AssertionError(var4);
}
}
在 Appendable 接口中,append 办法是会抛出 IOException 的。然而 StringBuilder 虽然完成了 Appendable,可是它覆盖完成的 append 办法却是不抛出 IOException 的。于是就出现了明函数调用可以出现在表达式中吗知不可能抛反常,却又不得不去捕获反常的尴尬。
这儿的反常处理办法十分机智,反常变量命名为 impossib函数调用栈le,咱们一看就理解这儿是不会抛出 IOException 的。可是假如 catch 块字符间距加宽2磅怎么设置里面什么都不做又好像不合适初始化是什么意思,于是抛出一个 AssertionError,函数调用的三种方式表明关于这儿不抛反常的断语失利了。
另一个比较指针式万用表有意思的 appendTo 重载是关于可变长参数。
public final <A extends Appendable> A appendTo(A appendable, @Nullable Object first, @Nullable Object second, Object... rest) throws IOException {
return this.appendTo((Appendable)appendable, (Iterable)iterable(first, second, rest));
}
注意到这儿的 iterable 办法,它把两个变量和一个数组变成了一个完成了Iterabl初始化电脑时出现问题e 接口的调集,十分精妙的完成!
private static Iterable<Object> iterable(final Object first, final Object second, final Object[] rest) {
Preconditions.checkNotNull(rest);
return new AbstractList() {
public int size() {
return rest.length + 2;
}
public Object get(int index) {
switch(index) {
case 0:
return first;
case 1:
return second;
default:
return rest[index - 2];
}
}
};
}
要想看理解这段代码,指针c语言需求熟悉AbstractList类中迭代器的完成。迭代器内部维护着一个游标,c指针式万用表ursor。迭代器的两大要害操作,hasNext 判别是否还有没遍历的元素,next 获初始化电脑的后果取下一个元素,它们的完成是这样的。
public boolean hasNext() {
return cursor != size();
}
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
hasNext 中要害的函数调用源码是size办法,获取调集的巨细。nex字符t 办法中要害的函数调用是get办法,获取第 i 个元素。Guava 的完成回来了一个被覆盖了 size 和 get 办法的 A字符是什么bstractList,巧妙的复用了由编译器生成的数组,避免了新建列表初始化失败是怎么解决和增加元素的开支。
拼接Map键值对
MapJoine初始化sdk什么意思r 完源码时代成为 Joiner 的一个静态内部类初始化磁盘,它的构造函数和 Joiner 一样也是私有,只字符能经过 withKeyValueSep初始化英文arator来生成实例指针式万用表。类似地,MapJoiner 也完成了 appendT源码网站o 办法和一系列的重载,还用 join 办法对 app字符常量endT初始化游戏启动器失败o 做了初始化是什么意思封装。字符
MapJoiner 整个完成和 Joiner 大同小异,在完成中大量运用 Joiner 的 toString 办法来保证空指针维护行为和初始化时的语义共同源码网站。