Is there any clean way to check if they are all null or not for example getDescription(), getName(), getScript(), getTargets() and getTrigger() is null or not, checking in one line?
ruleBean.setDescription(rule.getDescription());
} else if (rule.getName() != null) {
ruleBean.setName(rule.getName());
} else if (rule.getScript() != null) {
ruleBean.setScript(rule.getScript());
} else if (rule.getTargets() != null) {
ruleBean.setTargets(rule.getTargets());
} else if (rule.getTrigger() != null) {
ruleBean.setTrigger(rule.getTrigger());
} else {
return ResponseBean.builder().withData(request.getData())
.withMessage("No data provided for rule update").asFailure().build();
} ```
Advertisement
Answer
You can write a single condition with Optional:
if (rule.getName() != null) {
ruleBean.setName(rule.getName());
}
becomes:
Optional.ofNullable(rule.getName()).ifPresent(ruleBean::setName);
It’s harder to chain this to give the “if else” behaviour you have, though.
It looks like what you’re trying to detect with the “if/else” is whether some update was performed. To achieve this, you could have a method like:
<T> boolean did(T value, Consumer<? super T> consumer) {
if (value == null) return false;
consumer.accept(value);
return true;
}
Then you can write your chain as:
boolean didSomething =
did(rule.getName(), ruleBean::setName)
|| did(rule.getScript(), ruleBean::setScript) /* etc */;
if (!didSomething) {
// Return your error response.
}
Because of the short-circuiting behaviour of ||, this will stop after the first call to did which “did” something, like the if/else if.
And if you actually want to apply the update for any non-null value, simply change || to |. The value of didSomething is still false if none of the conditions matched, as before.