2017-06-13 7 views
4

簡潔にするために、しばしば二重コロン表記を使用します。二重列表記で関数とコンシューマを結合する

私はエンティティの短いリストを取得し、それらを検証し、データベースに保存する以下のメソッドを書いています。私は、構文後validator変数

をインスタンス化するために避け速記構文があるかどうかを知りたいのですが

@[email protected] 
public void bulkValidate(Collection<Entity> transactions) 
{ 
    Consumer<Entity> validator = entityValidator::validate; 
    validator = validator.andThen(getDao()::update); 
    if (transactions != null) 
     transactions.forEach(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)) 
関連する問題