2017-06-13 37 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))