使用双列表示法将功能和使用者组合在一起

时间:2017-06-13 08:20:40

标签: java-8 functional-interface

为了简洁,我经常使用双冒号表示法。

我正在编写以下方法,该方法获取实体的简短列表,验证它们并保存回数据库。

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

}

我想知道是否存在避免实例化validator变量的简写语法

以下语法无效(“此表达式的目标类型必须是功能接口”)

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

1 个答案:

答案 0 :(得分:6)

可以这样做,但你需要明确地投射......

 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))