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日

results matching ""

    No results matching ""