Spring Expression Language – Java 8 forEach或stream on list

是否可以在SpEL中列出stream或forEach? 例如

List x = new LinkedList(Arrays.asList("A","AAB")); ExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext context = new StandardEvaluationContext(x); parser.parseExpression("x.stream().map(x -> x.replaceAll(\"A\", \"B\")).collect(Collectors.toList())").getValue(context)) 

SpEL不是Java,它是一种不同的语言; 首字母缩写词代表Spring Expression Language

它不懂Java8 lambdas所以无法解析x -> ...

此外,使用T运算符调用静态方法。

所以,这有效……

 List x = new LinkedList<>(Arrays.asList("A","AAB")); ExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression("stream().collect(T(java.util.stream.Collectors).toList())"); System.out.println(expression.getValue(x)); 

(但它不是很有用)。

你可以使用流,但只能使用不带lambdas的简单方法…

 Expression expression = parser.parseExpression("stream().findFirst().get()"); Expression expression = parser.parseExpression("stream().count()"); 

要么

 List x = new LinkedList<>(Arrays.asList("A","AAB", "A")); ExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression("stream().distinct().collect(T(java.util.stream.Collectors).toList())"); System.out.println(expression.getValue(x)); 

等等

编辑

但是,你可以将lambdas注册为SpEL #functions,所以这很好……

 public class So48840190Application { public static void main(String[] args) throws Exception { List x = new LinkedList<>(Arrays.asList("A","AAB", "A")); ExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext ec = new StandardEvaluationContext(); ec.registerFunction("aToB", So48840190Application.class.getMethod("aToB")); Expression expression = parser.parseExpression( "stream().map(#aToB()).collect(T(java.util.stream.Collectors).toList())"); System.out.println(expression.getValue(ec, x)); } public static Function aToB() { return s -> s.replaceAll("A", "B"); } } 

 [B, BBB, B] 

EDIT2

或者,更一般地……

 public class So48840190Application { public static void main(String[] args) throws Exception { List x = new LinkedList<>(Arrays.asList("A","AAB", "A")); ExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext ec = new StandardEvaluationContext(); ec.registerFunction("replaceAll", So48840190Application.class.getMethod("replaceAll", String.class, String.class)); ec.registerFunction("toLowerCase", So48840190Application.class.getMethod("toLowerCase")); Expression expression = parser.parseExpression( "stream().map(#replaceAll('A', 'B')).map(#toLowerCase()).collect(T(java.util.stream.Collectors).toList())"); System.out.println(expression.getValue(ec, x)); } public static Function replaceAll(String from, String to) { return s -> s.replaceAll(from, to); } public static Function toLowerCase() { return String::toLowerCase; } }