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; } }