java-8 - 用双列表示法结合函数和消费者

标签 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 的速记语法多变的

以下语法无效(“此表达式的目标类型必须是功能接口(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/

相关文章:

Java 8 CompletableFuture 、流和超时

java - 为什么在 Java 流中 flatMap() 之后的 filter() 是 "not completely"惰性的?

lambda - 自定义功能接口(interface)汇总统计

java - 为什么不同的谓词接口(interface)n JAVA 8?

java - 功能接口(interface)的概念

java 8 - 在 HashMap 中存储方法并从 map 中的方法获取返回值

Java 8 流和并行流

java - 为什么@FunctionalInterface没有在合格的JDK的所有接口(interface)上使用?

java - 是否可以在 Junit 5 中使用 Java 功能接口(interface)实现(例如 Supplier)作为 MethodSource?

java - CompletableFuture 获得第一个 future 的结果,等待其他 future 取决于第一个