为了简洁,我经常使用双冒号表示法。
我正在编写以下方法,该方法获取实体的简短列表,验证它们并保存回数据库。
@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));
答案 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))