Is it possible to use lambda
for@ConditionalOnExpression
in spring expression language (SpEL)?
I have created the following SpEL condition via collection-selection which works fine for me. But I am not satisfied how it looks like.
@ConditionalOnExpression("#{T(java.util.Arrays).asList('${app.sync.white-list}').?[#this.toLowerCase() == 'all' or #this.toLowerCase() == 'phone'].size() > 0}")
In Java
the logic for the condition is the following:
Arrays.stream(a).anyMatch(x -> "all".equalsIgnoreCase(x) || "phone".equalsIgnoreCase(x))
I wonder if it is possible to make that SpEL condition look nicer via using anyMatch
and lambda
?
There is no reason to over-complicate SpEL: just have that logic in some static
method and use it via T
operator: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#expressions-types. Or you can register it as a function in the EvaluationContext
. See same doc.
The point is that SpEL is an interpreted language: the longer and and complex expression - the slower calculation.