Supplier
supplier 英 [səˈplaɪə(r)] 美 [səˈplaɪər]
n. 供应商;供应国;供应者,供给者;补充者
接口定义
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
看语义,可以看到,这个接口是一个提供者的意思,只有一个 get 的抽象类,没有默认的方法以及静态的方法,传入一个泛型 T 的,get 方法,返回一个泛型 T,直接理解成一个创建对象的工厂。
supplier 是用来创建对象的,但是不同于传统的创建对象语法:new,每 get()
一次,都会创建一个对象。我们可以把耗资源运算放到 get()
方法里,在程序里,我们传递的是 Supplier 对象,直到调用 get()
方法时,运算才会执行。这就是所谓的惰性求值。
比如:
你需要频繁地从客户端代码去查询一个对象的状态(比如下文例子中的日志器的状态),只是为了传递参数、调用该对象的一个方法(比如输出一条日志),那么可以考虑实现一个新的方法,以 Lambda 或者方法表达式作为参数,新方法在检查完该对象的状态之后才调用原来的方法.你的代码会因此而变得更易读(结构更清晰),封装性更好(对象的状态也不会暴露给客户端代码了)。
Supplier<String> supplier = String::new;
System.out.println(supplier.get());
Supplier<Person> personSupplier = Person::new;
personSupplier.get(); // new Person
public void log(Level level, Supplier<String> msgSupplier){
if(logger.isLoggable(level)){
log(level, msgSupplier.get());
}
}
Map.computeIfAbsent
在1.8的 Map
接口中,增加了一个方法 computeIfAbsent
,此方法签名如下:
public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
此方法首先判断缓存 Map
中是否存在指定 key 的值,如果不存在,会自动调用 mappingFunction(key)
计算 key 的 value,然后将 key = value 放入到缓存 Map。如果 mappingFunction(key)
返回的值为 null 或抛出异常,则不会有记录存入 Map。
//1. default
//第一个参数为Map的key,第二个参数是一个函数接口
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
//2. requireNonNull
Objects.requireNonNull(mappingFunction);
V v;
// 将第一个参数作为key,获取value,并将其赋给v ,判断是否为null
if ((v = get(key)) == null) {
//若v 为null,则创建一个新的值newValue
V newValue;
// 3. mappingFunction.apply
if ((newValue = mappingFunction.apply(key)) != null) {
put(key, newValue);
return newValue;
}
}
return v;
}
更新于2019年04月19日