使用双列符号组合函数和消费者

Combining functions and consumers with double-column notation

为了简洁起见,我经常使用双冒号符号。

我正在编写以下方法,它获取一个简短的实体列表,对其进行验证,然后保存回数据库。

@Override@Transactional
public void bulkValidate(Collection<Entity> transactions)
{
    Consumer<Entity> validator = entityValidator::validate;
    validator = validator.andThen(getDao()::update);
    if (transactions != null)
        transactions.forEach(validator);

}

我想知道是否有 shorthand 语法避免实例化 validator 变量

以下语法无效 ("The target type of this expression must be a functional interface")

transactions.forEach((entityValidator::validate).andThen(getDao()::update));

可以这样做,但你需要显式地转换...

 transactions.forEach(((Consumer<Entity>)(entityValidator::validate))
                             .andThen(getDao()::update));

问题是像这样的方法引用 entityValidator::validate 没有类型,它是一个 poly 表达式,它取决于上下文。

您还可以定义一个方法来组合这些消费者:

@SafeVarargs
private static <T> Consumer<T> combine(Consumer<T>... consumers) {
    return Arrays.stream(consumers).reduce(s -> {}, Consumer::andThen);
}

并使用它:

transactions.forEach(combine(entityValidator::validate, getDao()::update))