2017-06-13 4 views
4

Ich verwende oft die Doppelpunkt-Notation für die Kürze.Kombinieren Funktionen und Verbraucher mit Doppelspalten-Notation

Ich schreibe die folgende Methode, die eine kurze Liste von Entitäten, validiert sie und speichert zurück in die Datenbank.

@[email protected] 
public void bulkValidate(Collection<Entity> transactions) 
{ 
    Consumer<Entity> validator = entityValidator::validate; 
    validator = validator.andThen(getDao()::update); 
    if (transactions != null) 
     transactions.forEach(validator); 

} 

Ich mag gerne wissen, ob es eine Kurz Syntax ist die Vermeidung der validator Variable

folgende Syntax ist ungültig („Der Zieltyp dieses Ausdrucks muss eine funktionale Schnittstelle sein“) instanziiert

transactions.forEach((entityValidator::validate).andThen(getDao()::update)); 

Antwort

4

Sie könnte das tun, aber Sie würden ausdrücklich zu werfen brauchen ...

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

Die Sache ist, dass eine Methodenreferenz wie diese entityValidator::validate keinen Typ hat, es ist ein Poly Ausdruck und es hängt vom Kontext ab.

könnten Sie definieren auch eine Methode, um diese Verbraucher zu kombinieren:

@SafeVarargs 
private static <T> Consumer<T> combine(Consumer<T>... consumers) { 
    return Arrays.stream(consumers).reduce(s -> {}, Consumer::andThen); 
} 

Und es verwenden:

transactions.forEach(combine(entityValidator::validate, getDao()::update)) 
Verwandte Themen