Collections2
private Collections2() {
}
private Collections2() {
}
ExecutorService executor = Executors.newSingleThreadExecutor();
SettableFuture<Integer> future = SettableFuture.create();
// 使用其他线程去 set 对应的结果。
executor.submit(() -> {
future.set(1);
});
Futures.addCallback(future, new FutureCallback<>() {
@Override
public void onSuccess(Integer result) {
// main线程执行的
System.out.println("result=" + result + "线程名:" + Thread.currentThread().getName());//main
}
@Override
public void onFailure(Throwable t) {
}
}, MoreExecutors.directExecutor());
Guava 使用术语 流来表示可关闭的,并且在底层资源中有位置状态的 I/O 数据流。字节流对应的工具类为 ByteSterams,字符流对应的工具类为 CharStreams。
Guava 中为了避免和流直接打交道,抽象出可读的 源 source 和可写的 汇 sink 两个概念,指可以从中打开流的资源,比如 File、URL,同样也分别有字节和字符对应的源和汇,定义了一系列读写的方法。
Guava IO 极大简化了文件和流的操作。比如说,读写文件这种看似简单的操作,在Java原生代码中可能要写好几行,还不包括错误处理。Guava则可以用一两行搞定,简洁到让人惊叹。其次,它还提供了更丰富的功能,比如对不同字符集的处理,还有资源的高效管理。这些都是在开发过程中经常遇到的问题,Guava给了我们优雅的解决方案。
如《Effective Java》Item1)所述,在设计类的时候,倾向优先使用静态工厂方法(static factory method)而非构造函数(constructor)创建对象,优点在于:
Map 可以实现 key -> value 的映射,如果想要 value -> key 的映射,就需要定义两个 Map,并且同步更新,很不优雅。Guava 提供了 BiMap 支持支持双向的映射关系,常用实现有HashMap, EnumBiMap, EnumHashBiMap...
。
而它对key和value严格的保证唯一性。如果使用put方法添加相同的value值或key值则会抛出异常:java.lang.IllegalArgumentException,如果使用forcePut方法添加则会覆盖掉原来的value值。
Guava 提供了一系列用于字符串处理的工具:
nullToEmpty(@Nullable String string):如果非空,则返回给定的字符串;否则返回空字符串
public static String nullToEmpty(@Nullable String string) {
//如果string为null则返回空字符串,否则返回给定的string
return string == null ? "" : string;
}
.isNullOrEmpty(@Nullable String string):如果字符串为空或长度为0返回true,否则返回false
public static boolean isNullOrEmpty(@Nullable String string) {
return string == null || string.length() == 0;
}
emptyToNull(@Nullable String string):如果非空,则返回给定的字符串;否则返回null
public static String emptyToNull(@Nullable String string) {
//调用isNullOrEmpty方法,如果返回true则return null,否则返回原字符串
return isNullOrEmpty(string)?null:string;
}