у вас может быть класс действия, который проверяет условие, а затем вызывает вашу службу или делегатов для следующего действия, например
new Action<>(oldInvestigator, newInvestigator)
.orExecute((o, n) -> o.getId() == null && n.getId() != null, (o, n) -> someService.sendEmailToInvestigator(n))
.orExecute((o, n) -> o.getId() != null && n.getId() != null, someService::updateInvestigator)
.orExecute((o, n) -> true, (o, n) -> someService.sendNotificationToLeader());
и вот как Action
выглядит так:
class Action<T1, T2> {
private T1 o1;
private T2 o2;
private boolean done;
//all args private constructor
//two args public constructor
Action<T1, T2> orExecute(BiPredicate<T1, T2> biPredicate, CheckedBiConsumer<T1, T2> biConsumer) throws Exception {
if(!done && biPredicate.test(o1, o2)) {
biConsumer.accept(o1, o2);
return new Action<>(o1, o2, true);
}
return this;
}
}