복붙노트

[SPRING] Spring Expression Language - Java 8 for each 또는 목록의 스트림

SPRING

Spring Expression Language - Java 8 for each 또는 목록의 스트림

SpEL의 목록에서 스트림 또는 forEach를 사용할 수 있습니까? 예 :

List<String> 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))

해결법

  1. ==============================

    1.SpEL은 Java가 아니며 다른 언어입니다. 약어는 Spring Expression Language (봄 표현 언어)의 약자입니다.

    SpEL은 Java가 아니며 다른 언어입니다. 약어는 Spring Expression Language (봄 표현 언어)의 약자입니다.

    그것은 Java8 람다를 이해하지 못하므로 x를 파싱 할 수 없습니다 -> ....

    또한 정적 메서드는 T 연산자와 함께 호출됩니다.

    그래서,이 작품은 ...

    List<String> 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));
    

    (하지만 그다지 유용하지는 않습니다).

    스트림을 사용할 수 있지만 람다를 사용하지 않는 간단한 방법 만 사용해야합니다.

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

    또는

    List<String> 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));
    

    기타

    편집하다

    당신은, 그러나, SpEL # 함수로 람다를 등록 할 수 있습니다, 그래서이 잘 작동 ...

    public class So48840190Application {
    
        public static void main(String[] args) throws Exception {
            List<String> 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<String, String> aToB() {
            return s -> s.replaceAll("A", "B");
        }
    
    }
    

    [B, BBB, B]
    

    놀이

    또는 더 일반적으로 ...

    public class So48840190Application {
    
        public static void main(String[] args) throws Exception {
            List<String> 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<String, String> replaceAll(String from, String to) {
            return s -> s.replaceAll(from, to);
        }
    
        public static Function<String, String> toLowerCase() {
            return String::toLowerCase;
        }
    
    }
    
  2. from https://stackoverflow.com/questions/48840190/spring-expression-language-java-8-foreach-or-stream-on-list by cc-by-sa and MIT license