使用双列符号组合函数和消费者
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))
为了简洁起见,我经常使用双冒号符号。
我正在编写以下方法,它获取一个简短的实体列表,对其进行验证,然后保存回数据库。
@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))