java Spel with stream API

494 Views Asked by At

I have this string 1|1|1|1 and I want to sum the numbers inside spel statement. I tried this one but got wrong expression.

T(java.util.Arrays).stream(SERVICE_CLASS.split('|')).reduce(Integer::sum)

the log :

org.springframework.expression.spel.SpelParseException: Expression [new Object[] {T(java.util.Arrays).stream(SERVICE_CLASS.split('|')).reduce(Integer::sum)}] @81: EL1043E: Unexpected token. Expected 'rparen())' but was 'colon(:)'

the full code :

 @Test fun `test sum values`() {
    val cont = ScriptingContext.default();

    val contextrecord: Map<String, String> = mapOf(
        "value" to "1|1|1|1"
    )


    val context = cont.getEvalContext()
    context.setRootObject(contextrecord)
    val value = cont.parser.parseExpression("new Object[] {T(java.util.Arrays).stream(value.split('|')).reduce(Integer::sum)}").getValue(context) as Array<Object>
    println(value.toString())
    assertEquals(value[0], "4")
}

any suggest to do it ?

1

There are 1 best solutions below

2
On

SpEL stands for Spring Expression LANGUAGE. It is not Java; no lambdas, or method references are supported.

You can, however, register lambdas as SpEL functions; see Spring Expression Language - Java 8 forEach or stream on list