为了简洁起见,我经常使用双冒号表示法。
我正在编写以下方法,该方法需要一个简短的实体列表,验证它们,然后保存回数据库。
@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
的速记语法多变的以下语法无效(“此表达式的目标类型必须是功能接口(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))
关于java-8 - 用双列表示法结合函数和消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44515968/