2017-06-13 38 views
4

为了简洁,我经常使用双冒号符号。将功能和消费者结合在一起使用双列符号

我正在写下面的方法,它需要一个简短的实体列表,验证它们,并保存回数据库。

@[email protected] 
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)); 

回答

4

可以做到这一点,但你需要显式转换...

transactions.forEach(((Consumer<Entity>)(entityValidator::validate)) 
          .andThen(getDao()::update)); 

事情是像这样的方法参考entityValidator::validate没有类型,它是一个表达式,它取决于上下文。

你也可以定义一个方法,这些消费者结合起来:

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